From 816542fdd4994240d76629534607bc2452abae32 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Tue, 14 Nov 2023 16:02:23 +0100 Subject: [PATCH 01/23] Collect coverage from cypress component tests. --- .gitignore | 2 + .travis.yml | 2 +- config/webpack.cy.config.js | 10 + cypress.config.ts | 2 + cypress/support/component.ts | 1 + package-lock.json | 6737 +++++++++++++++++++++++++++------- package.json | 5 + 7 files changed, 5479 insertions(+), 1280 deletions(-) diff --git a/.gitignore b/.gitignore index 82b5669b9..a436d4107 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,8 @@ Session.vim .idea/ .vscode/ coverage/ +.nyc_output +cypress-coverage # cypress diff snapshots cypress/**/*.diff.png diff --git a/.travis.yml b/.travis.yml index 3b9b016d9..234ab9f5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ jobs: include: - stage: Test if: branch != nightly - script: npm run circular && npm run lint && npm run test && npx codecov && npm run test:ct + script: npm run circular && npm run lint && npm run test && npm run test:ct && npx codecov - stage: Deploy prod-stable if: branch = prod-stable AND type != pull_request name: deploy:prod-stable diff --git a/config/webpack.cy.config.js b/config/webpack.cy.config.js index ad9f6a784..925f40f3e 100644 --- a/config/webpack.cy.config.js +++ b/config/webpack.cy.config.js @@ -32,6 +32,16 @@ const JSConfig = { loader: 'swc-loader', options: { jsc: { + experimental: { + plugins: [ + [ + 'swc-plugin-coverage-instrument', + { + compact: false, + }, + ], + ], + }, parser: { syntax: 'typescript', tsx: true, diff --git a/cypress.config.ts b/cypress.config.ts index f4f28ab5c..2e04bb16b 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -22,6 +22,8 @@ export default defineConfig({ launchOptions.preferences.height = 720; } }); + require('@cypress/code-coverage/task')(on, config); + return config; }, video: false, devServer: { diff --git a/cypress/support/component.ts b/cypress/support/component.ts index c50104685..dd8a0ff85 100644 --- a/cypress/support/component.ts +++ b/cypress/support/component.ts @@ -21,6 +21,7 @@ import './commands' import '../../src/sass/chrome.scss' import '../../src/sass/pf-5-assets.scss' import { mount } from 'cypress/react18' +import '@cypress/code-coverage/support' // Alternatively you can use CommonJS syntax: // require('./commands') diff --git a/package-lock.json b/package-lock.json index b215000db..bd67ae3fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,6 +62,7 @@ "urijs": "^1.19.11" }, "devDependencies": { + "@cypress/code-coverage": "^3.12.9", "@openshift/dynamic-plugin-sdk-webpack": "^3.0.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^1.2.6", @@ -124,6 +125,7 @@ "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", "swc-loader": "^0.2.3", + "swc-plugin-coverage-instrument": "^0.0.20", "terser-webpack-plugin": "^5.3.6", "typescript": "^4.9.5", "url": "^0.11.3", @@ -232,9 +234,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -303,14 +305,40 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -319,6 +347,65 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -353,29 +440,42 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -384,6 +484,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", @@ -393,6 +506,42 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/helper-simple-access": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", @@ -405,6 +554,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", @@ -436,10 +598,25 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, "engines": { "node": ">=6.9.0" } @@ -483,6 +660,70 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -519,6 +760,80 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -630,6 +945,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", @@ -660,793 +991,1060 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "peer": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, + "peer": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", + "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", "dev": true, + "peer": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cypress/request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", - "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, + "peer": true, "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "6.10.4", - "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", + "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", + "dev": true, + "peer": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 0.12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dev": true, + "peer": true, "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", + "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", + "dev": true, + "peer": true, "dependencies": { - "ms": "^2.1.1" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@data-driven-forms/common": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@data-driven-forms/common/-/common-3.21.0.tgz", - "integrity": "sha512-QbmjZdmRRW3eUBrn47a/Jcwd/MEP7fa/AU0PWIhewfZd/c25jZm3/3vwO940qumjnyqYlIGJhl2D9vstHqud6w==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "dev": true, + "peer": true, "dependencies": { - "clsx": "^1.0.4", - "lodash": "^4.17.15", - "prop-types": "^15.7.2" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.2 || ^18.0.0", - "react-dom": "^16.13.1 || ^17.0.2 || ^18.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@data-driven-forms/pf4-component-mapper": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@data-driven-forms/pf4-component-mapper/-/pf4-component-mapper-3.21.0.tgz", - "integrity": "sha512-yAELVJ/OPLTzldnf38q3EGw3rKUtjmLLihSk9n2k8ElZnPwVUlEJS7OgDaoObDsO/VtqNLdcQUo3774/fsGsjw==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dev": true, + "peer": true, "dependencies": { - "@data-driven-forms/common": "^3.21.0", - "downshift": "^5.4.3", - "lodash": "^4.17.21", - "prop-types": "^15.7.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@data-driven-forms/react-form-renderer": "^3.21.0", - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-icons": "^5.0.0", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@data-driven-forms/react-form-renderer": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@data-driven-forms/react-form-renderer/-/react-form-renderer-3.21.0.tgz", - "integrity": "sha512-b8ihG2BDzTyVDBsgxT5UxZE9kwMXqNUOZMZ4rWTk0G79cA/G9aPdFOinomFVBb85tLn21t3+QMq0uA4GlH0Xkg==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dev": true, + "peer": true, "dependencies": { - "final-form": "^4.20.4", - "final-form-arrays": "^3.0.2", - "final-form-focus": "^1.1.2", - "lodash": "^4.17.15", - "prop-types": "^15.7.2", - "react-final-form": "^6.5.0", - "react-final-form-arrays": "^3.1.1" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.2 || ^18.0.0", - "react-dom": "^16.13.1 || ^17.0.2 || ^18.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dependents/detective-less": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-3.0.2.tgz", - "integrity": "sha512-1YUvQ+e0eeTWAHoN8Uz2x2U37jZs6IGutiIE5LXId7cxfUGhtZjzxE06FdUiuiRrW+UE0vNCdSNPH2lY4dQCOQ==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, + "peer": true, "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^5.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/is-prop-valid": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz", - "integrity": "sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", + "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", + "dev": true, + "peer": true, "dependencies": { - "@emotion/memoize": "0.7.1" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/memoize": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz", - "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, + "peer": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", + "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, + "peer": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", + "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", "dev": true, + "peer": true, "dependencies": { - "type-fest": "^0.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", + "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@formatjs/cli": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-4.8.4.tgz", - "integrity": "sha512-zZI8QYVl5CHaT6j9OHjS+0mMnWzopBVH0un4n5b4IhIJRzIKnxwFTkxBp5Ifqj6FntrwzIGqP+D6v8u7MPYsmw==", + "peer": true, "dependencies": { - "@formatjs/icu-messageformat-parser": "2.1.0", - "@formatjs/ts-transformer": "3.9.4", - "@types/estree": "^0.0.50", - "@types/fs-extra": "^9.0.1", - "@types/json-stable-stringify": "^1.0.32", - "@types/node": "14", - "@vue/compiler-core": "^3.2.23", - "chalk": "^4.0.0", - "commander": "8", - "fast-glob": "^3.2.7", - "fs-extra": "10", - "json-stable-stringify": "^1.0.1", - "loud-rejection": "^2.2.0", - "tslib": "^2.1.0", - "typescript": "^4.5", - "vue": "^3.2.23" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, - "bin": { - "formatjs": "bin/formatjs" - } - }, - "node_modules/@formatjs/cli/node_modules/@formatjs/ts-transformer": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.9.4.tgz", - "integrity": "sha512-S5q/zsTodaKtxVxNvbRQ9APenJtm5smXE76usS+5yF2vWQdZHkagmOKWfgvfIbesP4SR2B+i3koqlnlpqSIp5w==", - "dependencies": { - "@formatjs/icu-messageformat-parser": "2.1.0", - "@types/node": "14 || 16 || 17", - "chalk": "^4.0.0", - "tslib": "^2.1.0", - "typescript": "^4.5" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "ts-jest": "27" - }, - "peerDependenciesMeta": { - "ts-jest": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dev": true, + "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dev": true, + "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dev": true, + "peer": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@formatjs/cli/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, "engines": { - "node": ">= 12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz", - "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/fast-memoize": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", - "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", + "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", + "dev": true, + "peer": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz", - "integrity": "sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", + "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/icu-skeleton-parser": "1.3.6", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz", - "integrity": "sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", + "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "tslib": "^2.1.0" + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.9.0.tgz", - "integrity": "sha512-Ym0trUoC/VO6wQu4YHa0H1VR2tEixFRmwZgADkDLm7nD+vv1Ob+/88mUAoT0pwvirFqYKgUKEwp1tFepqyqvVA==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/ecma402-abstract": "1.17.0", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.6.0", - "@formatjs/intl-displaynames": "6.5.0", - "@formatjs/intl-listformat": "7.4.0", - "intl-messageformat": "10.5.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" }, - "peerDependencies": { - "typescript": "^4.7 || 5" + "engines": { + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl-displaynames": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.5.0.tgz", - "integrity": "sha512-sg/nR8ILEdUl+2sWu6jc1nQ5s04yucGlH1RVfatW8TSJ5uG3Yy3vgigi8NNC/BuhcncUNPWqSpTCSI1hA+rhiw==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", + "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/ecma402-abstract": "1.17.0", - "@formatjs/intl-localematcher": "0.4.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl-displaynames/node_modules/@formatjs/ecma402-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", - "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", + "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/intl-localematcher": "0.4.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl-displaynames/node_modules/@formatjs/intl-localematcher": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", - "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, + "peer": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl-listformat": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.4.0.tgz", - "integrity": "sha512-ifupb+balZUAF/Oh3QyGRqPRWGSKwWoMPR0cYZEG7r61SimD+m38oFQqVx/3Fp7LfQFF11m7IS+MlxOo2sKINA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/ecma402-abstract": "1.17.0", - "@formatjs/intl-localematcher": "0.4.0", - "tslib": "^2.4.0" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl-listformat/node_modules/@formatjs/ecma402-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", - "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", + "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/intl-localematcher": "0.4.0", - "tslib": "^2.4.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl-listformat/node_modules/@formatjs/intl-localematcher": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", - "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dev": true, + "peer": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz", - "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dev": true, + "peer": true, "dependencies": { - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl/node_modules/@formatjs/ecma402-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", - "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/intl-localematcher": "0.4.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.0.tgz", - "integrity": "sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/ecma402-abstract": "1.17.0", - "@formatjs/icu-skeleton-parser": "1.6.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl/node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.0.tgz", - "integrity": "sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dev": true, + "peer": true, "dependencies": { - "@formatjs/ecma402-abstract": "1.17.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl/node_modules/@formatjs/intl-localematcher": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", - "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dev": true, + "peer": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, + "peer": true, "dependencies": { - "@hapi/hoek": "^9.0.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, + "peer": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=12.22" + "node": ">=6.9.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, + "peer": true, "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, + "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "node": ">=6.9.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, + "peer": true, "dependencies": { - "p-locate": "^4.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@babel/preset-env": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", "dev": true, + "peer": true, "dependencies": { - "p-try": "^2.0.0" + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "peer": true, "dependencies": { - "p-limit": "^2.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", "dev": true, + "peer": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/console": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", - "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "slash": "^3.0.0" + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/console/node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/console/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cypress/code-coverage": { + "version": "3.12.9", + "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.12.9.tgz", + "integrity": "sha512-MIVISl2WOYzV0DgRZXs9wxYRBMM5eN2n/p4PN0wPJCATllfv8nqqyMC1TGWBrf8Di+QMikUjbSZ20w/5+9w4Lg==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "@cypress/webpack-preprocessor": "^6.0.0", + "chalk": "4.1.2", + "dayjs": "1.11.10", + "debug": "4.3.4", + "execa": "4.1.0", + "globby": "11.0.4", + "istanbul-lib-coverage": "3.0.0", + "js-yaml": "4.1.0", + "nyc": "15.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.1", + "@babel/preset-env": "^7.0.0", + "babel-loader": "^8.3 || ^9", + "cypress": "*", + "webpack": "^4 || ^5" } }, - "node_modules/@jest/console/node_modules/ansi-styles": { + "node_modules/@cypress/code-coverage/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -1461,7 +2059,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/console/node_modules/chalk": { + "node_modules/@cypress/code-coverage/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -1477,7 +2075,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/console/node_modules/color-convert": { + "node_modules/@cypress/code-coverage/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -1489,13 +2087,33 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/console/node_modules/color-name": { + "node_modules/@cypress/code-coverage/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/console/node_modules/has-flag": { + "node_modules/@cypress/code-coverage/node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@cypress/code-coverage/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -1504,7 +2122,16 @@ "node": ">=8" } }, - "node_modules/@jest/console/node_modules/supports-color": { + "node_modules/@cypress/code-coverage/node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@cypress/code-coverage/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -1516,239 +2143,317 @@ "node": ">=8" } }, - "node_modules/@jest/core": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", - "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", - "dev": true, + "node_modules/@cypress/request": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dependencies": { - "@jest/console": "^29.6.2", - "@jest/reporters": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-resolve-dependencies": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "jest-watcher": "^29.6.2", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.10.4", + "safe-buffer": "^5.1.2", + "tough-cookie": "^4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/@jest/core/node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", - "dev": true, + "node_modules/@cypress/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dependencies": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.12" } }, - "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "node_modules/@cypress/webpack-preprocessor": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-6.0.0.tgz", + "integrity": "sha512-1AS1Et5CNPJii0+DdBZBS8e0hlM2BkBNmYRdZO4/16A3KS3em1sjPZtFw7jJF00m6DYAdB9iy6QW/lLZ2bN0gg==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "bluebird": "3.7.1", + "debug": "^4.3.4", + "lodash": "^4.17.20" + }, + "peerDependencies": { + "@babel/core": "^7.0.1", + "@babel/preset-env": "^7.0.0", + "babel-loader": "^8.3 || ^9", + "webpack": "^4 || ^5" } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@cypress/webpack-preprocessor/node_modules/bluebird": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", + "dev": true + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@data-driven-forms/common": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@data-driven-forms/common/-/common-3.21.0.tgz", + "integrity": "sha512-QbmjZdmRRW3eUBrn47a/Jcwd/MEP7fa/AU0PWIhewfZd/c25jZm3/3vwO940qumjnyqYlIGJhl2D9vstHqud6w==", + "dependencies": { + "clsx": "^1.0.4", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "react": "^16.13.1 || ^17.0.2 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.2 || ^18.0.0" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@data-driven-forms/pf4-component-mapper": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@data-driven-forms/pf4-component-mapper/-/pf4-component-mapper-3.21.0.tgz", + "integrity": "sha512-yAELVJ/OPLTzldnf38q3EGw3rKUtjmLLihSk9n2k8ElZnPwVUlEJS7OgDaoObDsO/VtqNLdcQUo3774/fsGsjw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@data-driven-forms/common": "^3.21.0", + "downshift": "^5.4.3", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@data-driven-forms/react-form-renderer": "^3.21.0", + "@patternfly/react-core": "^5.0.0", + "@patternfly/react-icons": "^5.0.0", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + } + }, + "node_modules/@data-driven-forms/react-form-renderer": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@data-driven-forms/react-form-renderer/-/react-form-renderer-3.21.0.tgz", + "integrity": "sha512-b8ihG2BDzTyVDBsgxT5UxZE9kwMXqNUOZMZ4rWTk0G79cA/G9aPdFOinomFVBb85tLn21t3+QMq0uA4GlH0Xkg==", + "dependencies": { + "final-form": "^4.20.4", + "final-form-arrays": "^3.0.2", + "final-form-focus": "^1.1.2", + "lodash": "^4.17.15", + "prop-types": "^15.7.2", + "react-final-form": "^6.5.0", + "react-final-form-arrays": "^3.1.1" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "react": "^16.13.1 || ^17.0.2 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.2 || ^18.0.0" } }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@dependents/detective-less": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-3.0.2.tgz", + "integrity": "sha512-1YUvQ+e0eeTWAHoN8Uz2x2U37jZs6IGutiIE5LXId7cxfUGhtZjzxE06FdUiuiRrW+UE0vNCdSNPH2lY4dQCOQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "gonzales-pe": "^4.3.0", + "node-source-walk": "^5.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "node_modules/@emotion/is-prop-valid": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz", + "integrity": "sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==", + "dependencies": { + "@emotion/memoize": "0.7.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz", + "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jest/core/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@jest/create-cache-key-function": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz", - "integrity": "sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jest/environment": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", - "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "jest-mock": "^29.6.2" + "type-fest": "^0.20.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "node_modules/@eslint/js": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@formatjs/cli": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-4.8.4.tgz", + "integrity": "sha512-zZI8QYVl5CHaT6j9OHjS+0mMnWzopBVH0un4n5b4IhIJRzIKnxwFTkxBp5Ifqj6FntrwzIGqP+D6v8u7MPYsmw==", "dependencies": { - "@types/yargs-parser": "*" + "@formatjs/icu-messageformat-parser": "2.1.0", + "@formatjs/ts-transformer": "3.9.4", + "@types/estree": "^0.0.50", + "@types/fs-extra": "^9.0.1", + "@types/json-stable-stringify": "^1.0.32", + "@types/node": "14", + "@vue/compiler-core": "^3.2.23", + "chalk": "^4.0.0", + "commander": "8", + "fast-glob": "^3.2.7", + "fs-extra": "10", + "json-stable-stringify": "^1.0.1", + "loud-rejection": "^2.2.0", + "tslib": "^2.1.0", + "typescript": "^4.5", + "vue": "^3.2.23" + }, + "bin": { + "formatjs": "bin/formatjs" } }, - "node_modules/@jest/environment/node_modules/ansi-styles": { + "node_modules/@formatjs/cli/node_modules/@formatjs/ts-transformer": { + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.9.4.tgz", + "integrity": "sha512-S5q/zsTodaKtxVxNvbRQ9APenJtm5smXE76usS+5yF2vWQdZHkagmOKWfgvfIbesP4SR2B+i3koqlnlpqSIp5w==", + "dependencies": { + "@formatjs/icu-messageformat-parser": "2.1.0", + "@types/node": "14 || 16 || 17", + "chalk": "^4.0.0", + "tslib": "^2.1.0", + "typescript": "^4.5" + }, + "peerDependencies": { + "ts-jest": "27" + }, + "peerDependenciesMeta": { + "ts-jest": { + "optional": true + } + } + }, + "node_modules/@formatjs/cli/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1759,11 +2464,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/environment/node_modules/chalk": { + "node_modules/@formatjs/cli/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1775,11 +2479,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/environment/node_modules/color-convert": { + "node_modules/@formatjs/cli/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1787,26 +2490,31 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/environment/node_modules/color-name": { + "node_modules/@formatjs/cli/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@jest/environment/node_modules/has-flag": { + "node_modules/@formatjs/cli/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@formatjs/cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } }, - "node_modules/@jest/environment/node_modules/supports-color": { + "node_modules/@formatjs/cli/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -1814,160 +2522,336 @@ "node": ">=8" } }, - "node_modules/@jest/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", - "dev": true, + "node_modules/@formatjs/ecma402-abstract": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz", + "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==", "dependencies": { - "expect": "^29.6.2", - "jest-snapshot": "^29.6.2" + "@formatjs/intl-localematcher": "0.2.25", + "tslib": "^2.1.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", + "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz", + "integrity": "sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.11.4", + "@formatjs/icu-skeleton-parser": "1.3.6", + "tslib": "^2.1.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz", + "integrity": "sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@formatjs/intl": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.9.0.tgz", + "integrity": "sha512-Ym0trUoC/VO6wQu4YHa0H1VR2tEixFRmwZgADkDLm7nD+vv1Ob+/88mUAoT0pwvirFqYKgUKEwp1tFepqyqvVA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.0", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.6.0", + "@formatjs/intl-displaynames": "6.5.0", + "@formatjs/intl-listformat": "7.4.0", + "intl-messageformat": "10.5.0", + "tslib": "^2.4.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "typescript": "^4.7 || 5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@jest/expect-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", - "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "node_modules/@formatjs/intl-displaynames": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.5.0.tgz", + "integrity": "sha512-sg/nR8ILEdUl+2sWu6jc1nQ5s04yucGlH1RVfatW8TSJ5uG3Yy3vgigi8NNC/BuhcncUNPWqSpTCSI1hA+rhiw==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.0", + "@formatjs/intl-localematcher": "0.4.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-displaynames/node_modules/@formatjs/ecma402-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", + "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", + "dependencies": { + "@formatjs/intl-localematcher": "0.4.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-displaynames/node_modules/@formatjs/intl-localematcher": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", + "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-listformat": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.4.0.tgz", + "integrity": "sha512-ifupb+balZUAF/Oh3QyGRqPRWGSKwWoMPR0cYZEG7r61SimD+m38oFQqVx/3Fp7LfQFF11m7IS+MlxOo2sKINA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.0", + "@formatjs/intl-localematcher": "0.4.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-listformat/node_modules/@formatjs/ecma402-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", + "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", + "dependencies": { + "@formatjs/intl-localematcher": "0.4.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-listformat/node_modules/@formatjs/intl-localematcher": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", + "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz", + "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@formatjs/intl/node_modules/@formatjs/ecma402-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", + "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", + "dependencies": { + "@formatjs/intl-localematcher": "0.4.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.0.tgz", + "integrity": "sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.0", + "@formatjs/icu-skeleton-parser": "1.6.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl/node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.0.tgz", + "integrity": "sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl/node_modules/@formatjs/intl-localematcher": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", + "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3" + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10.10.0" } }, - "node_modules/@jest/fake-timers": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", - "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@jest/fake-timers/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/fake-timers/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/fake-timers/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/@jest/fake-timers/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/fake-timers/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/@jest/fake-timers/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/@jest/globals": { + "node_modules/@jest/console": { "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", - "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", + "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", "@jest/types": "^29.6.1", - "jest-mock": "^29.6.2" + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/globals/node_modules/@jest/types": { + "node_modules/@jest/console/node_modules/@jest/types": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", @@ -1984,7 +2868,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/globals/node_modules/@types/yargs": { + "node_modules/@jest/console/node_modules/@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", @@ -1993,7 +2877,7 @@ "@types/yargs-parser": "*" } }, - "node_modules/@jest/globals/node_modules/ansi-styles": { + "node_modules/@jest/console/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2008,7 +2892,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/globals/node_modules/chalk": { + "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2024,7 +2908,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/globals/node_modules/color-convert": { + "node_modules/@jest/console/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2036,13 +2920,13 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/globals/node_modules/color-name": { + "node_modules/@jest/console/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/globals/node_modules/has-flag": { + "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -2051,7 +2935,7 @@ "node": ">=8" } }, - "node_modules/@jest/globals/node_modules/supports-color": { + "node_modules/@jest/console/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -2063,36 +2947,40 @@ "node": ">=8" } }, - "node_modules/@jest/reporters": { + "node_modules/@jest/core": { "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", - "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", + "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", "dev": true, "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.6.2", + "@jest/reporters": "^29.6.2", "@jest/test-result": "^29.6.2", "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", - "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", + "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", + "ci-info": "^3.2.0", "exit": "^0.1.2", - "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.2", + "jest-haste-map": "^29.6.2", "jest-message-util": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-resolve-dependencies": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-validate": "^29.6.2", + "jest-watcher": "^29.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.2", "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "strip-ansi": "^6.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2106,7 +2994,7 @@ } } }, - "node_modules/@jest/reporters/node_modules/@jest/types": { + "node_modules/@jest/core/node_modules/@jest/types": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", @@ -2123,7 +3011,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters/node_modules/@types/yargs": { + "node_modules/@jest/core/node_modules/@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", @@ -2132,7 +3020,7 @@ "@types/yargs-parser": "*" } }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { + "node_modules/@jest/core/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2147,7 +3035,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/reporters/node_modules/chalk": { + "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2163,7 +3051,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/reporters/node_modules/color-convert": { + "node_modules/@jest/core/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2175,13 +3063,13 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/reporters/node_modules/color-name": { + "node_modules/@jest/core/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/reporters/node_modules/has-flag": { + "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -2190,60 +3078,78 @@ "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.27.8" + "has-flag": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/source-map": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", - "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "node_modules/@jest/create-cache-key-function": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz", + "integrity": "sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@jest/types": "^27.5.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/test-result": { + "node_modules/@jest/environment": { "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", - "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", + "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", + "@jest/fake-timers": "^29.6.2", "@jest/types": "^29.6.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@types/node": "*", + "jest-mock": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-result/node_modules/@jest/types": { + "node_modules/@jest/environment/node_modules/@jest/types": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", @@ -2260,7 +3166,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-result/node_modules/@types/yargs": { + "node_modules/@jest/environment/node_modules/@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", @@ -2269,7 +3175,7 @@ "@types/yargs-parser": "*" } }, - "node_modules/@jest/test-result/node_modules/ansi-styles": { + "node_modules/@jest/environment/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2284,7 +3190,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/test-result/node_modules/chalk": { + "node_modules/@jest/environment/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2300,7 +3206,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/test-result/node_modules/color-convert": { + "node_modules/@jest/environment/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2312,13 +3218,13 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/test-result/node_modules/color-name": { + "node_modules/@jest/environment/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/test-result/node_modules/has-flag": { + "node_modules/@jest/environment/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -2327,7 +3233,7 @@ "node": ">=8" } }, - "node_modules/@jest/test-result/node_modules/supports-color": { + "node_modules/@jest/environment/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -2339,48 +3245,49 @@ "node": ">=8" } }, - "node_modules/@jest/test-sequencer": { + "node_modules/@jest/expect": { "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", - "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.2", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "slash": "^3.0.0" + "expect": "^29.6.2", + "jest-snapshot": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform": { + "node_modules/@jest/expect-utils": { "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", - "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", + "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", + "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", "@jest/types": "^29.6.1", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/@jest/types": { + "node_modules/@jest/fake-timers/node_modules/@jest/types": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", @@ -2397,7 +3304,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/@types/yargs": { + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", @@ -2406,7 +3313,7 @@ "@types/yargs-parser": "*" } }, - "node_modules/@jest/transform/node_modules/ansi-styles": { + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2421,7 +3328,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/transform/node_modules/chalk": { + "node_modules/@jest/fake-timers/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2437,7 +3344,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/transform/node_modules/color-convert": { + "node_modules/@jest/fake-timers/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2449,19 +3356,13 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/transform/node_modules/color-name": { + "node_modules/@jest/fake-timers/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/has-flag": { + "node_modules/@jest/fake-timers/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -2470,7 +3371,7 @@ "node": ">=8" } }, - "node_modules/@jest/transform/node_modules/supports-color": { + "node_modules/@jest/fake-timers/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -2482,23 +3383,48 @@ "node": ">=8" } }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/@jest/globals": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", + "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "dependencies": { + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^16.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { + "node_modules/@jest/globals/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/globals/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2513,7 +3439,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/types/node_modules/chalk": { + "node_modules/@jest/globals/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2529,7 +3455,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/types/node_modules/color-convert": { + "node_modules/@jest/globals/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2541,13 +3467,13 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/types/node_modules/color-name": { + "node_modules/@jest/globals/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/types/node_modules/has-flag": { + "node_modules/@jest/globals/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -2556,7 +3482,7 @@ "node": ">=8" } }, - "node_modules/@jest/types/node_modules/supports-color": { + "node_modules/@jest/globals/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -2568,197 +3494,702 @@ "node": ">=8" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@jest/reporters": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", + "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">=6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@jest/reporters/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@types/yargs-parser": "*" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/@lukeed/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "@lukeed/csprng": "^1.1.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "dependencies": { - "eslint-scope": "5.1.1" + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@jest/test-result": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", + "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@openshift/dynamic-plugin-sdk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@openshift/dynamic-plugin-sdk/-/dynamic-plugin-sdk-4.0.0.tgz", - "integrity": "sha512-OQsRqpRFz8IO6dZP6oKqdS7fLpdK25jxteevhussWFDd6RETNaLAG9GaSfvN0oigrzNIUTwH59kJx8PP8PrMug==", + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, "dependencies": { - "lodash": "^4.17.21", - "semver": "^7.3.7", - "uuid": "^8.3.2", - "yup": "^0.32.11" - }, - "peerDependencies": { - "react": "^17 || ^18" + "@types/yargs-parser": "*" } }, - "node_modules/@openshift/dynamic-plugin-sdk-webpack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@openshift/dynamic-plugin-sdk-webpack/-/dynamic-plugin-sdk-webpack-3.0.1.tgz", - "integrity": "sha512-W7tDWLwZ17ebbawrIsI1MEM+8ldmpqPTKcONVmKcY/k+VgqVrGHlISHQE/Ykpd2Zu4J7FMx/CLIb86Ad1wwPxg==", + "node_modules/@jest/test-result/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "lodash": "^4.17.21", - "yup": "^0.32.11" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=16" + "node": ">=8" }, - "peerDependencies": { - "webpack": "^5.75.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@openshift/dynamic-plugin-sdk/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@jest/test-result/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@openshift/dynamic-plugin-sdk/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@jest/test-result/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, - "node_modules/@openshift/dynamic-plugin-sdk/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/@jest/test-result/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/@patternfly/patternfly": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.0.4.tgz", - "integrity": "sha512-8akdWzFpG384Q6Es8lzkfuhAlzVGrNK7TJqXGecHDAg8u1JsYn3+Nw6gLRviI88z8Kjxmg5YKirILjpclGxkIA==" + "node_modules/@jest/test-result/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/@patternfly/quickstarts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@patternfly/quickstarts/-/quickstarts-5.1.0.tgz", + "node_modules/@jest/test-result/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", + "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", + "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@lukeed/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", + "dependencies": { + "@lukeed/csprng": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@openshift/dynamic-plugin-sdk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@openshift/dynamic-plugin-sdk/-/dynamic-plugin-sdk-4.0.0.tgz", + "integrity": "sha512-OQsRqpRFz8IO6dZP6oKqdS7fLpdK25jxteevhussWFDd6RETNaLAG9GaSfvN0oigrzNIUTwH59kJx8PP8PrMug==", + "dependencies": { + "lodash": "^4.17.21", + "semver": "^7.3.7", + "uuid": "^8.3.2", + "yup": "^0.32.11" + }, + "peerDependencies": { + "react": "^17 || ^18" + } + }, + "node_modules/@openshift/dynamic-plugin-sdk-webpack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@openshift/dynamic-plugin-sdk-webpack/-/dynamic-plugin-sdk-webpack-3.0.1.tgz", + "integrity": "sha512-W7tDWLwZ17ebbawrIsI1MEM+8ldmpqPTKcONVmKcY/k+VgqVrGHlISHQE/Ykpd2Zu4J7FMx/CLIb86Ad1wwPxg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21", + "yup": "^0.32.11" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "webpack": "^5.75.0" + } + }, + "node_modules/@openshift/dynamic-plugin-sdk/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@openshift/dynamic-plugin-sdk/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@openshift/dynamic-plugin-sdk/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@patternfly/patternfly": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.0.4.tgz", + "integrity": "sha512-8akdWzFpG384Q6Es8lzkfuhAlzVGrNK7TJqXGecHDAg8u1JsYn3+Nw6gLRviI88z8Kjxmg5YKirILjpclGxkIA==" + }, + "node_modules/@patternfly/quickstarts": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/quickstarts/-/quickstarts-5.1.0.tgz", "integrity": "sha512-ql5Q8IlW+Yp1Y7rqDqrsoDhYrSv3/HTp+1BYg7n4vyOsTc9QL+PxW4+PI8mLLk/tB6Z93yS7l76b5gaACPgH2g==", "dependencies": { "@patternfly/react-catalog-view-extension": "^5.0.0", @@ -9055,6 +10486,18 @@ "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", "dev": true }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -9074,6 +10517,12 @@ } ] }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -9556,6 +11005,81 @@ "node": ">=8" } }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "peer": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "peer": true + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -9587,6 +11111,48 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", @@ -9939,9 +11505,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -9958,10 +11524,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -10045,6 +11611,48 @@ "node": ">=6" } }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caching-transform/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -10086,9 +11694,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001520", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", - "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", + "version": "1.0.30001562", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001562.tgz", + "integrity": "sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==", "dev": true, "funding": [ { @@ -10628,6 +12236,20 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, + "node_modules/core-js-compat": { + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", + "dev": true, + "peer": true, + "dependencies": { + "browserslist": "^4.22.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-js-pure": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.0.tgz", @@ -11367,9 +12989,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", - "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debounce-promise": { "version": "3.1.2", @@ -11392,6 +13014,15 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", @@ -11526,6 +13157,21 @@ "node": ">=10.17.0" } }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -12117,9 +13763,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.490", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", - "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", + "version": "1.4.582", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.582.tgz", + "integrity": "sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA==", "dev": true }, "node_modules/emittery": { @@ -12350,6 +13996,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "node_modules/es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", @@ -13301,6 +14953,23 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "peer": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -13409,6 +15078,19 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -13585,6 +15267,26 @@ "node": ">= 0.6" } }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -14094,6 +15796,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -15362,6 +17089,18 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", @@ -15378,6 +17117,50 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -19122,6 +20905,19 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "peer": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -20034,6 +21830,18 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -20263,6 +22071,293 @@ "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nyc/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nyc/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -20699,6 +22794,21 @@ "node": ">=6" } }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -21051,6 +23161,110 @@ "node": ">=12.13.0" } }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "peer": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "peer": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "peer": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "peer": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -21626,6 +23840,18 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -22232,11 +24458,41 @@ "redux": "^2.0.0 || ^3.0.0 || ^4.0.0" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "peer": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "peer": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, "node_modules/regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", @@ -22259,6 +24515,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "peer": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -22268,6 +24565,18 @@ "node": ">= 0.10" } }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -22538,6 +24847,12 @@ "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "node_modules/requirejs": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", @@ -23199,6 +25514,12 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -23447,6 +25768,53 @@ "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -23884,6 +26252,12 @@ "webpack": ">=2" } }, + "node_modules/swc-plugin-coverage-instrument": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/swc-plugin-coverage-instrument/-/swc-plugin-coverage-instrument-0.0.20.tgz", + "integrity": "sha512-WXTGILCZE2hW61yrmxi6doN/UB4RT2K1JJSQVPn9JMJ6X4WJpZsesHi4lHy6qRKVsNIlHZvTWofkpuRi/WQUig==", + "dev": true + }, "node_modules/symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -24430,6 +26804,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -24462,6 +26845,50 @@ "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "peer": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/unicode-trie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", @@ -24526,9 +26953,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -26598,6 +29025,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -26887,323 +29320,1205 @@ "tslib": "^2.3.1" } }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + } + }, + "@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true + }, + "@babel/core": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + } + }, + "@babel/eslint-parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.10.tgz", + "integrity": "sha512-0J8DNPRXQRLeR9rPaUMM3fA+RbixjnVLe/MRMYCkp3hzgsSuxCHQ8NN8xQG1wIHKJ4a1DTROTvFJdW+B5/eOsg==", + "dev": true, + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + } + }, + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "peer": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "peer": true, + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "peer": true, + "requires": { + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "peer": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + } + }, + "@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "peer": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + } + }, + "@babel/helpers": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" + } + }, + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + } + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "peer": true, + "requires": {} + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", + "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", + "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", + "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", + "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", + "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", + "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", + "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", "dev": true, + "peer": true, "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, - "@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "dev": true - }, - "@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, + "peer": true, "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/eslint-parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.10.tgz", - "integrity": "sha512-0J8DNPRXQRLeR9rPaUMM3fA+RbixjnVLe/MRMYCkp3hzgsSuxCHQ8NN8xQG1wIHKJ4a1DTROTvFJdW+B5/eOsg==", + "@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, + "peer": true, "requires": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, + "peer": true, "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" } }, - "@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, + "peer": true, "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, + "peer": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/helper-hoist-variables": { + "@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, + "peer": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, + "peer": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", + "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", "dev": true, + "peer": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "@babel/plugin-transform-numeric-separator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", + "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", "dev": true, + "peer": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "@babel/plugin-transform-object-rest-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", + "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", "dev": true, + "peer": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" } }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true + "@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + } }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", + "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } }, - "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true + "@babel/plugin-transform-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", + "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } }, - "@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, + "peer": true, "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, + "peer": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" + "@babel/plugin-transform-private-property-in-object": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", + "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, - "@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "@babel/preset-env": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" } }, - "@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "peer": true + }, "@babel/runtime": { "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", @@ -27264,6 +30579,94 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "optional": true }, + "@cypress/code-coverage": { + "version": "3.12.9", + "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.12.9.tgz", + "integrity": "sha512-MIVISl2WOYzV0DgRZXs9wxYRBMM5eN2n/p4PN0wPJCATllfv8nqqyMC1TGWBrf8Di+QMikUjbSZ20w/5+9w4Lg==", + "dev": true, + "requires": { + "@cypress/webpack-preprocessor": "^6.0.0", + "chalk": "4.1.2", + "dayjs": "1.11.10", + "debug": "4.3.4", + "execa": "4.1.0", + "globby": "11.0.4", + "istanbul-lib-coverage": "3.0.0", + "js-yaml": "4.1.0", + "nyc": "15.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@cypress/request": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", @@ -27301,6 +30704,25 @@ } } }, + "@cypress/webpack-preprocessor": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-6.0.0.tgz", + "integrity": "sha512-1AS1Et5CNPJii0+DdBZBS8e0hlM2BkBNmYRdZO4/16A3KS3em1sjPZtFw7jJF00m6DYAdB9iy6QW/lLZ2bN0gg==", + "dev": true, + "requires": { + "bluebird": "3.7.1", + "debug": "^4.3.4", + "lodash": "^4.17.20" + }, + "dependencies": { + "bluebird": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", + "dev": true + } + } + }, "@cypress/xvfb": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", @@ -32620,11 +36042,26 @@ "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", "dev": true }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, "arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -32978,6 +36415,62 @@ } } }, + "babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "peer": true, + "requires": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "peer": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "peer": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "peer": true + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "peer": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, "babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -33003,6 +36496,39 @@ "@types/babel__traverse": "^7.0.6" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "peer": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + } + }, "babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", @@ -33289,15 +36815,15 @@ } }, "browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" } }, "bser": { @@ -33352,6 +36878,41 @@ "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==" }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -33384,9 +36945,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001520", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", - "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", + "version": "1.0.30001562", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001562.tgz", + "integrity": "sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==", "dev": true }, "caseless": { @@ -33806,6 +37367,16 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, + "core-js-compat": { + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", + "dev": true, + "peer": true, + "requires": { + "browserslist": "^4.22.1" + } + }, "core-js-pure": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.0.tgz", @@ -34363,9 +37934,9 @@ } }, "dayjs": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", - "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "debounce-promise": { "version": "3.1.2", @@ -34380,6 +37951,12 @@ "ms": "2.1.2" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, "decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", @@ -34482,6 +38059,15 @@ } } }, + "default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, "defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -34944,9 +38530,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.490", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", - "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", + "version": "1.4.582", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.582.tgz", + "integrity": "sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA==", "dev": true }, "emittery": { @@ -35129,6 +38715,12 @@ "is-symbol": "^1.0.2" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", @@ -35846,6 +39438,17 @@ } } }, + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "peer": true, + "requires": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + } + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -35923,6 +39526,16 @@ "is-callable": "^1.1.3" } }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -36045,6 +39658,12 @@ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -36411,6 +40030,24 @@ "has-symbols": "^1.0.2" } }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -37321,6 +40958,15 @@ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, "istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", @@ -37334,6 +40980,40 @@ "semver": "^6.3.0" } }, + "istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -40233,6 +43913,19 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "peer": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -40901,6 +44594,15 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, "node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -41087,6 +44789,226 @@ "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -41396,6 +45318,18 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -41680,6 +45614,73 @@ } } }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "peer": true, + "requires": { + "find-up": "^6.3.0" + }, + "dependencies": { + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "peer": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "peer": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "peer": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "peer": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "peer": true + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "peer": true + } + } + }, "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -42078,6 +46079,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -42529,11 +46539,38 @@ "integrity": "sha512-B/Hi5Ct5d9y5d/KG0f6MZUXKA0nrQh5583mHCx13HY3Avte8KfpoRH/TB5QT6k/FcjT6JCxjv7jedymidy2A1A==", "requires": {} }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "peer": true + }, + "regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "peer": true, + "requires": { + "regenerate": "^1.4.2" + } + }, "regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "peer": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, "regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", @@ -42550,12 +46587,55 @@ "functions-have-names": "^1.2.3" } }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "peer": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "peer": true + } + } + }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -42764,6 +46844,12 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "requirejs": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", @@ -43247,6 +47333,12 @@ "send": "0.18.0" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -43439,6 +47531,40 @@ "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -43779,6 +47905,12 @@ "dev": true, "requires": {} }, + "swc-plugin-coverage-instrument": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/swc-plugin-coverage-instrument/-/swc-plugin-coverage-instrument-0.0.20.tgz", + "integrity": "sha512-WXTGILCZE2hW61yrmxi6doN/UB4RT2K1JJSQVPn9JMJ6X4WJpZsesHi4lHy6qRKVsNIlHZvTWofkpuRi/WQUig==", + "dev": true + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -44192,6 +48324,15 @@ "is-typed-array": "^1.1.9" } }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -44214,6 +48355,38 @@ "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "peer": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "peer": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "peer": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "peer": true + }, "unicode-trie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", @@ -44268,9 +48441,9 @@ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" }, "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -46056,6 +50229,12 @@ "is-weakset": "^2.0.1" } }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, "which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", diff --git a/package.json b/package.json index e46b3b887..47dafed48 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ }, "homepage": "https://github.com/RedHatInsights/insights-chrome#readme", "devDependencies": { + "@cypress/code-coverage": "^3.12.9", "@openshift/dynamic-plugin-sdk-webpack": "^3.0.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^1.2.6", @@ -114,6 +115,7 @@ "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", "swc-loader": "^0.2.3", + "swc-plugin-coverage-instrument": "^0.0.20", "terser-webpack-plugin": "^5.3.6", "typescript": "^4.9.5", "url": "^0.11.3", @@ -179,5 +181,8 @@ }, "insights": { "appname": "chrome" + }, + "nyc": { + "report-dir": "cypress-coverage" } } From 4e16cbd8c3aa79dc97a9f25678538c1d44c4efc0 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Thu, 23 Nov 2023 13:47:40 +0100 Subject: [PATCH 02/23] Use insights text for landing page check. --- cypress/e2e/release-gate/favorite-services.cy.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/e2e/release-gate/favorite-services.cy.tsx b/cypress/e2e/release-gate/favorite-services.cy.tsx index c409bbb52..a4ede7438 100644 --- a/cypress/e2e/release-gate/favorite-services.cy.tsx +++ b/cypress/e2e/release-gate/favorite-services.cy.tsx @@ -1,8 +1,8 @@ const service = '/application-services/api-management'; let interceptionCounter = false; -const serviceName = 'API Management'; +const serviceName = 'Red Hat Insights'; -describe('Favorite-services', () => { +describe.skip('Favorite-services', () => { it('check and uncheck favorited services', () => { cy.visit('/'); cy.login(); From e39402284c8bfbd261d4c44d6cbdec6c75f0eb40 Mon Sep 17 00:00:00 2001 From: Karel Hala Date: Mon, 27 Nov 2023 10:44:05 +0100 Subject: [PATCH 03/23] Use correct docs api link --- src/components/Routes/Routes.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Routes/Routes.tsx b/src/components/Routes/Routes.tsx index d8649b3ad..d7d4d5114 100644 --- a/src/components/Routes/Routes.tsx +++ b/src/components/Routes/Routes.tsx @@ -18,7 +18,7 @@ const redirects = [ }, { path: '/docs', - to: '/api/docs', + to: '/docs/api', }, { path: '/settings', From 52c269662b8d61cd2aa0a007de40e575d0bcb114 Mon Sep 17 00:00:00 2001 From: Aneela Chagarlamudi Date: Mon, 27 Nov 2023 09:11:36 -0500 Subject: [PATCH 04/23] Replace Cognito with Keycloak and remove cognito --- src/auth/index.ts | 26 ++--- src/bootstrap.tsx | 38 +++----- src/chrome/create-chrome.ts | 16 +-- src/components/Header/UserToggle.tsx | 5 +- src/jwt/Priv.ts | 7 +- src/jwt/__mocks__/keycloak-js.ts | 4 +- src/jwt/initialize-jwt.ts | 37 +++---- src/jwt/jwt.ts | 139 ++++++++++----------------- src/jwt/offline.ts | 6 +- src/jwt/user.ts | 14 +-- src/utils/common.ts | 6 +- src/utils/consts.ts | 4 +- 12 files changed, 100 insertions(+), 202 deletions(-) diff --git a/src/auth/index.ts b/src/auth/index.ts index 559fc44a0..28ede508a 100644 --- a/src/auth/index.ts +++ b/src/auth/index.ts @@ -5,8 +5,6 @@ import { ChromeUser } from '@redhat-cloud-services/types'; import { Store } from 'redux'; import * as jwt from '../jwt/jwt'; -import { createUser, getTokenWithAuthorizationCode } from '../cognito/auth'; -import { ITLessCognito } from '../utils/common'; import consts, { defaultAuthOptions as defaultOptions } from '../utils/consts'; import { ACCOUNT_REQUEST_TIMEOUT, ACTIVE_REMOTE_REQUEST, CROSS_ACCESS_ACCOUNT_NUMBER, CROSS_ACCESS_ORG_ID } from '../utils/consts'; import qe from '../utils/iqeEnablement'; @@ -20,7 +18,6 @@ export type LibJWT = { }; const TIMER_STR = '[JWT][jwt.js] Auth time'; -const isITLessCognito = ITLessCognito(); function bouncer() { if (!jwt.isAuthenticated()) { cookie.remove(defaultOptions.cookieName); @@ -59,26 +56,17 @@ export const createAuthObject = (libjwt: LibJWT, getUser: () => Promise Promise) => { - if (isITLessCognito) { - return () => createUser(); - } else { - return () => - libjwt.initPromise.then(libjwt.jwt.getUserInfo).catch(() => { - libjwt.jwt.logoutAllTabs(); - }); - } + return () => + libjwt.initPromise.then(libjwt.jwt.getUserInfo).catch(() => { + libjwt.jwt.logoutAllTabs(); + }); }; export const createGetUserPermissions = (libJwt: LibJWT, getUser: () => Promise) => { const fetchPermissions = createFetchPermissionsWatcher(getUser); return async (app = '', bypassCache?: boolean) => { - if (isITLessCognito) { - const cogToken = await getTokenWithAuthorizationCode(); - return fetchPermissions(cogToken || '', app, bypassCache); - } else { - await getUser(); - return fetchPermissions(libJwt.jwt.getEncodedToken() || '', app, bypassCache); - } + await getUser(); + return fetchPermissions(libJwt.jwt.getEncodedToken() || '', app, bypassCache); }; }; @@ -103,7 +91,7 @@ export default ({ ssoUrl, ssoScopes }: { ssoUrl?: string; ssoScopes: string[] }) const promise = jwt.init(options, ssoUrl).then(bouncer); return { - getOfflineToken: () => (isITLessCognito ? getTokenWithAuthorizationCode() : getOfflineToken(options.realm, options.clientId, ssoUrl)), + getOfflineToken: () => getOfflineToken(options.realm, options.clientId, ssoUrl), jwt: jwt, initPromise: promise, }; diff --git a/src/bootstrap.tsx b/src/bootstrap.tsx index c5d971bfa..f2dddd446 100644 --- a/src/bootstrap.tsx +++ b/src/bootstrap.tsx @@ -12,7 +12,7 @@ import { ACTIVE_REMOTE_REQUEST, CROSS_ACCESS_ACCOUNT_NUMBER } from './utils/cons import auth, { LibJWT, createGetUserPermissions, crossAccountBouncer } from './auth'; import sentry from './utils/sentry'; import registerAnalyticsObserver from './analytics/analyticsObserver'; -import { ITLess, ITLessCognito, generateRoutesList, getEnv, loadFedModules, noop, trustarcScriptSetup } from './utils/common'; +import { ITLess, generateRoutesList, getEnv, loadFedModules, noop, trustarcScriptSetup } from './utils/common'; import messages from './locales/data.json'; import ErrorBoundary from './components/ErrorComponents/ErrorBoundary'; import LibtJWTContext from './components/LibJWTContext'; @@ -22,7 +22,6 @@ import initializeJWT from './jwt/initialize-jwt'; import AppPlaceholder from './components/AppPlaceholder'; import { initializeVisibilityFunctions } from './utils/VisibilitySingleton'; import { createGetUser } from './auth'; -import { getTokenWithAuthorizationCode } from './cognito/auth'; const language: keyof typeof messages = 'en'; @@ -47,18 +46,16 @@ const initializeAccessRequestCookies = () => { const libjwtSetup = (chromeConfig: { ssoUrl?: string }, ssoScopes: string[] = []) => { const libjwt = auth({ ...chromeConfig, ssoScopes } || { ssoScopes }); - if (!ITLess()) { - libjwt.initPromise.then(() => { - return libjwt.jwt - .getUserInfo() - .then((chromeUser) => { - if (chromeUser) { - sentry(chromeUser); - } - }) - .catch(noop); - }); - } + libjwt.initPromise.then(() => { + return libjwt.jwt + .getUserInfo() + .then((chromeUser) => { + if (chromeUser) { + sentry(chromeUser); + } + }) + .catch(noop); + }); return libjwt; }; @@ -99,10 +96,7 @@ const useInitialize = () => { const getUser = createGetUser(libJwt); initializeVisibilityFunctions({ getUser, - getToken: () => - ITLessCognito() - ? getTokenWithAuthorizationCode() - : libJwt!.initPromise.then(() => libJwt!.jwt.getUserInfo().then(() => libJwt!.jwt.getEncodedToken())), + getToken: () => libJwt!.initPromise.then(() => libJwt!.jwt.getUserInfo().then(() => libJwt!.jwt.getEncodedToken())), getUserPermissions: createGetUserPermissions(libJwt, getUser), }); @@ -141,14 +135,6 @@ const App = () => { document.title = `${title}console.redhat.com`; }, [documentTitle]); - if (ITLessCognito()) { - return isReady && modules && scalprumConfig ? ( - - ) : ( - - ); - } - return isReady && modules && scalprumConfig && libJwt ? ( diff --git a/src/chrome/create-chrome.ts b/src/chrome/create-chrome.ts index 603b60a6c..3e24435bb 100644 --- a/src/chrome/create-chrome.ts +++ b/src/chrome/create-chrome.ts @@ -19,7 +19,7 @@ import { toggleFeedbackModal, toggleGlobalFilter, } from '../redux/actions'; -import { ITLess, ITLessCognito, getEnv, getEnvDetails, isBeta, isProd, updateDocumentTitle } from '../utils/common'; +import { ITLess, getEnv, getEnvDetails, isBeta, isProd, updateDocumentTitle } from '../utils/common'; import { createSupportCase } from '../utils/createCase'; import debugFunctions from '../utils/debugFunctions'; import { flatTags } from '../components/GlobalFilter/globalFilterApi'; @@ -31,8 +31,6 @@ import chromeHistory from '../utils/chromeHistory'; import { ReduxState } from '../redux/store'; import { STORE_INITIAL_HASH } from '../redux/action-types'; import { ChromeModule, FlagTagsFilter } from '../@types/types'; -import { createCognitoAuthObject } from '../cognito'; -import { getTokenWithAuthorizationCode } from '../cognito/auth'; import useBundle, { getUrl } from '../hooks/useBundle'; import { warnDuplicatePkg } from './warnDuplicatePackages'; import { getVisibilityFunctions } from '../utils/VisibilitySingleton'; @@ -99,11 +97,10 @@ export const createChromeContext = ({ }; const isITLessEnv = ITLess(); - const isITLessCognito = ITLessCognito(); const api: ChromeAPI = { ...actions, - auth: isITLessCognito ? createCognitoAuthObject(store) : createAuthObject(libJwt, getUser, store, modulesConfig), + auth: createAuthObject(libJwt, getUser, store, modulesConfig), initialized: true, isProd, forceDemo: () => Cookies.set('cs_demo', 'true'), @@ -114,13 +111,8 @@ export const createChromeContext = ({ getEnvironmentDetails: () => getEnvDetails(), createCase: (fields?: any) => getUser().then((user) => createSupportCase(user!.identity, libJwt, fields)), getUserPermissions: async (app = '', bypassCache?: boolean) => { - if (isITLessCognito) { - const cogToken = await getTokenWithAuthorizationCode(); - return fetchPermissions(cogToken || '', app, bypassCache); - } else { - await getUser(); - return fetchPermissions(libJwt.jwt.getEncodedToken() || '', app, bypassCache); - } + await getUser(); + return fetchPermissions(libJwt.jwt.getEncodedToken() || '', app, bypassCache); }, identifyApp, hideGlobalFilter: (isHidden: boolean) => { diff --git a/src/components/Header/UserToggle.tsx b/src/components/Header/UserToggle.tsx index 6848b60a0..21aa5b152 100644 --- a/src/components/Header/UserToggle.tsx +++ b/src/components/Header/UserToggle.tsx @@ -1,7 +1,7 @@ import './UserToggle.scss'; import { Dropdown, DropdownItem, DropdownList } from '@patternfly/react-core/dist/dynamic/components/Dropdown'; -import { ITLess, ITLessCognito, getEnv, isProd as isProdEnv } from '../../utils/common'; +import { ITLess, getEnv, isProd as isProdEnv } from '../../utils/common'; import React, { useRef, useState } from 'react'; import ChromeLink from '../ChromeLink/ChromeLink'; @@ -13,7 +13,6 @@ import { ReduxState } from '../../redux/store'; import { Tooltip } from '@patternfly/react-core/dist/dynamic/components/Tooltip'; import UserIcon from './UserIcon'; import classNames from 'classnames'; -import { cogLogout } from '../../cognito/auth'; import { logout } from '../../jwt/jwt'; import messages from '../../locales/Messages'; import { useIntl } from 'react-intl'; @@ -103,7 +102,7 @@ const buildItems = (username = '', isOrgAdmin?: boolean, accountNumber?: string, /> )} , - (ITLessCognito() ? cogLogout() : logout(true))}> + logout(true)}> {intl.formatMessage(messages.logout)} , extraItems, diff --git a/src/jwt/Priv.ts b/src/jwt/Priv.ts index f82199a78..f9a81b70f 100644 --- a/src/jwt/Priv.ts +++ b/src/jwt/Priv.ts @@ -1,7 +1,4 @@ import Keycloak, { KeycloakConfig, KeycloakInitOptions, KeycloakLoginOptions, KeycloakLogoutOptions } from 'keycloak-js'; -import { ITLessCognito } from '../utils/common'; - -const isITLessCognito = ITLessCognito(); export type PrivCookie = { cookieName: string; @@ -112,9 +109,7 @@ class Priv { updateToken() { // 5 is default KC value, min validaty is required by KC byt then has a default value for some reason - if (!isITLessCognito) { - return this._keycloak.updateToken(5); - } + return this._keycloak.updateToken(5); } } diff --git a/src/jwt/__mocks__/keycloak-js.ts b/src/jwt/__mocks__/keycloak-js.ts index dc170dd4d..9ad913647 100644 --- a/src/jwt/__mocks__/keycloak-js.ts +++ b/src/jwt/__mocks__/keycloak-js.ts @@ -1,6 +1,6 @@ import cookie from 'js-cookie'; import { data as encodedToken } from '../../../testdata/encodedToken.json'; -import { ITLessKeycloak } from '../../utils/common'; +import { ITLess } from '../../utils/common'; class Keycloak { scope: any; @@ -32,7 +32,7 @@ class Keycloak { this.responseMode = 'fragment'; this.responseType = 'code'; this.flow = 'standard'; - this.clientId = ITLessKeycloak() ? 'console-dot' : 'cloud-services'; + this.clientId = ITLess() ? 'console-dot' : 'cloud-services'; this.authServerUrl = 'https://sso.qa.redhat.com/auth'; this.realm = 'redhat-external'; this.endpoints = {}; diff --git a/src/jwt/initialize-jwt.ts b/src/jwt/initialize-jwt.ts index 885c28573..98e05eabf 100644 --- a/src/jwt/initialize-jwt.ts +++ b/src/jwt/initialize-jwt.ts @@ -1,37 +1,22 @@ import { ChromeUser } from '@redhat-cloud-services/types'; import { LibJWT } from '../auth'; import { spinUpStore } from '../redux/redux-config'; -import { ITLessCognito } from '../utils/common'; -import { createUser, getTokenWithAuthorizationCode } from '../cognito/auth'; const initializeJWT = async (libjwt: LibJWT) => { const { actions } = spinUpStore(); - if (ITLessCognito()) { - try { - await getTokenWithAuthorizationCode(); - const user = await createUser(); - if (user) { - actions.userLogIn(user as ChromeUser); - } - } catch (error) { - console.error(error); - actions.userLogIn(false); + try { + await libjwt.initPromise; + const user = await libjwt.jwt.getUserInfo(); + if (user) { + actions.userLogIn(user as ChromeUser); } - } else { - try { - await libjwt.initPromise; - const user = await libjwt.jwt.getUserInfo(); - if (user) { - actions.userLogIn(user as ChromeUser); - } - const encodedToken = libjwt.jwt.getEncodedToken(); - if (encodedToken) { - // chromeInstance.cache = new CacheAdapter('chrome-store', `${decodeToken(encodedToken).session_state}-chrome-store`); - } - } catch (error) { - console.error(error); - actions.userLogIn(false); + const encodedToken = libjwt.jwt.getEncodedToken(); + if (encodedToken) { + // chromeInstance.cache = new CacheAdapter('chrome-store', `${decodeToken(encodedToken).session_state}-chrome-store`); } + } catch (error) { + console.error(error); + actions.userLogIn(false); } }; diff --git a/src/jwt/jwt.ts b/src/jwt/jwt.ts index 4417b660f..983767d5c 100644 --- a/src/jwt/jwt.ts +++ b/src/jwt/jwt.ts @@ -6,7 +6,6 @@ import { DEFAULT_SSO_ROUTES, ITLess, ITLessCognito, - ITLessKeycloak, LOGIN_SCOPES_STORAGE_KEY, deleteLocalStorageItems, getRouterBasename, @@ -15,7 +14,7 @@ import { } from '../utils/common'; import * as Sentry from '@sentry/react'; import logger from './logger'; -import { CogUser, getTokenWithAuthorizationCode, getUser } from '../cognito/auth'; +import { getTokenWithAuthorizationCode } from '../cognito/auth'; // Insights Specific import platformUrl from './url'; @@ -30,7 +29,6 @@ const DEFAULT_COOKIE_NAME = 'cs_jwt'; const priv = new Priv(); const itLessCognito = ITLessCognito(); -const itLessKeycloakEnv = ITLessKeycloak(); enum AllowedPartnerScopes { aws = 'aws', @@ -171,80 +169,52 @@ export const init = (options: JWTInitOptions, configSsoUrl?: string) => { const cookieName = options.cookieName ? options.cookieName : DEFAULT_COOKIE_NAME; priv.setCookie({ cookieName }); - if (itLessCognito) { - let token; - let cogUser: CogUser; - - if (token) { - getUser().then((res) => { - cogUser = res; - if (cogUser) { - const now = Date.now().toString().substr(0, 10); - const exp = cogUser?.exp - parseInt(now); - if (exp < 30) { - return getTokenWithAuthorizationCode().then((res) => { - priv.setToken(res); - token = res; - return token; - }); - } - } - }); - } - return getTokenWithAuthorizationCode().then((res) => { - priv.setToken(res); - initSuccess(); - token = res; - return token; - }); - } else { - return Promise.resolve(platformUrl(options.routes ? options.routes : DEFAULT_SSO_ROUTES, configSsoUrl)).then((ssoUrl) => { - //constructor for new Keycloak Object? - options.url = ssoUrl; - options.clientId = itLessKeycloakEnv ? 'console-dot' : 'cloud-services'; - options.realm = 'redhat-external'; + return Promise.resolve(platformUrl(options.routes ? options.routes : DEFAULT_SSO_ROUTES, configSsoUrl)).then((ssoUrl) => { + //constructor for new Keycloak Object? + options.url = ssoUrl; + options.clientId = ITLess() ? 'console-dot' : 'cloud-services'; + options.realm = 'redhat-external'; - //options for keycloak.init method - options.promiseType = 'native'; - options.onLoad = 'check-sso'; - options.checkLoginIframe = false; + //options for keycloak.init method + options.promiseType = 'native'; + options.onLoad = 'check-sso'; + options.checkLoginIframe = false; - const isBeta = isBetaFunction() ? '/beta' : ''; + const isBeta = isBetaFunction() ? '/beta' : ''; - options.silentCheckSsoRedirectUri = `https://${window.location.host}${isBeta}/apps/chrome/silent-check-sso.html`; + options.silentCheckSsoRedirectUri = `https://${window.location.host}${isBeta}/apps/chrome/silent-check-sso.html`; - if (window.localStorage && window.localStorage.getItem('chrome:jwt:shortSession') === 'true') { - options.realm = 'short-session'; - } + if (window.localStorage && window.localStorage.getItem('chrome:jwt:shortSession') === 'true') { + options.realm = 'short-session'; + } - //priv.keycloak = Keycloak(options); - priv.setKeycloak(options, updateToken, loginAllTabs, refreshTokens); - - if (options.token) { - if (isExistingValid(options.token)) { - // we still need to init async - // so that the renewal times and such fire - priv.initializeKeycloak(options); - // Here we have an existing key - // We need to set up some of the keycloak state - // so that the reset of the methods that Chrome uses - // to check if things are good get faked out - // TODO reafctor the direct access to priv.keycloak - // away from the users - priv.setToken(options.token); - return Promise.resolve(); - // return new Promise((resolve) => { - - // resolve(); - // }); - } else { - delete options.token; - } + //priv.keycloak = Keycloak(options); + priv.setKeycloak(options, updateToken, loginAllTabs, refreshTokens); + + if (options.token) { + if (isExistingValid(options.token)) { + // we still need to init async + // so that the renewal times and such fire + priv.initializeKeycloak(options); + // Here we have an existing key + // We need to set up some of the keycloak state + // so that the reset of the methods that Chrome uses + // to check if things are good get faked out + // TODO reafctor the direct access to priv.keycloak + // away from the users + priv.setToken(options.token); + return Promise.resolve(); + // return new Promise((resolve) => { + + // resolve(); + // }); + } else { + delete options.token; } + } - return (priv.initialize(options) as unknown as Promise).then(initSuccess).catch(initError); - }); - } + return (priv.initialize(options) as unknown as Promise).then(initSuccess).catch(initError); + }); }; export function isExistingValid(token?: string) { @@ -448,26 +418,21 @@ export function getCookieExpires(exp: number) { } // Set the cookie for 3scale -export async function setCookie(token?: string) { +export function setCookie(token?: string) { log('Setting the cs_jwt cookie'); - let cogToken; - let cogUser; - if (itLessCognito) { - cogToken = await getTokenWithAuthorizationCode(); - cogUser = await getUser(); - } - const tok = itLessCognito ? cogToken : token; - if (tok && tok.length > 10) { - // FIXME: Fix cognito typing not to use any - const tokExpires = itLessCognito ? cogUser.exp : decodeToken(tok).exp; + if (token && token.length > 10) { const cookieName = priv.getCookie()?.cookieName; if (cookieName) { - setCookieWrapper(`${cookieName}=${tok};` + `path=/wss;` + `secure=true;` + `expires=${getCookieExpires(tokExpires)}`); - setCookieWrapper(`${cookieName}=${tok};` + `path=/ws;` + `secure=true;` + `expires=${getCookieExpires(tokExpires)}`); - setCookieWrapper(`${cookieName}=${tok};` + `path=/api/tasks/v1;` + `secure=true;` + `expires=${getCookieExpires(tokExpires)}`); - setCookieWrapper(`${cookieName}=${tok};` + `path=/api/automation-hub;` + `secure=true;` + `expires=${getCookieExpires(decodeToken(tok).exp)}`); - setCookieWrapper(`${cookieName}=${tok};` + `path=/api/remediations/v1;` + `secure=true;` + `expires=${getCookieExpires(tokExpires)}`); - setCookieWrapper(`${cookieName}=${tok};` + `path=/api/edge/v1;` + `secure=true;` + `expires=${getCookieExpires(tokExpires)}`); + setCookieWrapper(`${cookieName}=${token};` + `path=/wss;` + `secure=true;` + `expires=${getCookieExpires(decodeToken(token).exp)}`); + setCookieWrapper(`${cookieName}=${token};` + `path=/ws;` + `secure=true;` + `expires=${getCookieExpires(decodeToken(token).exp)}`); + setCookieWrapper(`${cookieName}=${token};` + `path=/api/tasks/v1;` + `secure=true;` + `expires=${getCookieExpires(decodeToken(token).exp)}`); + setCookieWrapper( + `${cookieName}=${token};` + `path=/api/automation-hub;` + `secure=true;` + `expires=${getCookieExpires(decodeToken(token).exp)}` + ); + setCookieWrapper( + `${cookieName}=${token};` + `path=/api/remediations/v1;` + `secure=true;` + `expires=${getCookieExpires(decodeToken(token).exp)}` + ); + setCookieWrapper(`${cookieName}=${token};` + `path=/api/edge/v1;` + `secure=true;` + `expires=${getCookieExpires(decodeToken(token).exp)}`); } } } diff --git a/src/jwt/offline.ts b/src/jwt/offline.ts index 921a916d6..d85593182 100644 --- a/src/jwt/offline.ts +++ b/src/jwt/offline.ts @@ -1,7 +1,7 @@ import consts, { OFFLINE_REDIRECT_STORAGE_KEY } from '../utils/consts'; import insightsUrl from './url'; import axios, { AxiosResponse } from 'axios'; -import { DEFAULT_SSO_ROUTES, ITLessKeycloak, getEnv } from '../utils/common'; +import { DEFAULT_SSO_ROUTES, ITLess, getEnv } from '../utils/common'; type Priv = { postbackUrl?: string; @@ -93,8 +93,8 @@ export function getPostDataObject(url: string, clientId: string, code: string) { return { code: code, grant_type: 'authorization_code', // eslint-disable-line camelcase - client_id: ITLessKeycloak() ? 'console-dot' : clientId, // eslint-disable-line camelcase - redirect_uri: ITLessKeycloak() ? redirectUrl : encodeURIComponent(url.split('#')[0]), // eslint-disable-line camelcase + client_id: ITLess() ? 'console-dot' : clientId, // eslint-disable-line camelcase + redirect_uri: ITLess() ? redirectUrl : encodeURIComponent(url.split('#')[0]), // eslint-disable-line camelcase }; } diff --git a/src/jwt/user.ts b/src/jwt/user.ts index 0a4ef036e..6f21223d4 100644 --- a/src/jwt/user.ts +++ b/src/jwt/user.ts @@ -1,11 +1,10 @@ -import { ITLessCognito, getRouterBasename, isBeta, isValidAccountNumber, pageAllowsUnentitled } from '../utils/common'; +import { getRouterBasename, isBeta, isValidAccountNumber, pageAllowsUnentitled } from '../utils/common'; import servicesApi from './entitlements'; import logger from './logger'; import { SSOParsedToken } from './Priv'; import { ChromeUser } from '@redhat-cloud-services/types'; import { isAnsibleTrialFlagActive } from '../utils/isAnsibleTrialFlagActive'; import chromeHistory from '../utils/chromeHistory'; -import { createUser } from '../cognito/auth'; const serviceAPI = servicesApi(); @@ -14,7 +13,6 @@ export type SSOServiceDetails = { is_trial: boolean; }; -const isITLessCognito = ITLessCognito(); const bounceInvocationLock: { [service: string]: boolean } = { // not_entitled modal should appear only once for insights bundle insights: false, @@ -167,7 +165,7 @@ export function tryBounceIfUnentitled( } export default async (token: SSOParsedToken): Promise => { - const user = isITLessCognito ? await createUser() : buildUser(token); + const user = buildUser(token); const pathName = getWindow().location.pathname.split('/'); pathName.shift(); @@ -186,15 +184,9 @@ export default async (token: SSOParsedToken): Promise => { is_trial: boolean; }; } = {}; - // let cogToken; - if (isITLessCognito) { - // cogToken = await getTokenWithAuthorizationCode(); - } try { if (user.identity.org_id) { - data = isITLessCognito - ? ((await serviceAPI.servicesGet()) as unknown as typeof data) - : ((await serviceAPI.servicesGet()) as unknown as typeof data); + data = (await serviceAPI.servicesGet()) as unknown as typeof data; } else { console.log('Cannot call entitlements API, no account number'); } diff --git a/src/utils/common.ts b/src/utils/common.ts index 8334a0d1b..8624d4f18 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -215,11 +215,7 @@ export function ITLess() { } export function ITLessCognito() { - return getEnv() === 'frh'; -} - -export function ITLessKeycloak() { - return getEnv() === 'ephem' || getEnv() === 'int' || getEnv() === 'scr' || getEnv() === 'frhStage'; + return getEnv() === 'ephem'; } export function updateDocumentTitle(title?: string, noSuffix = false) { diff --git a/src/utils/consts.ts b/src/utils/consts.ts index e5c66d79e..4b13bd206 100644 --- a/src/utils/consts.ts +++ b/src/utils/consts.ts @@ -1,4 +1,4 @@ -import { ITLess, ITLessKeycloak } from './common'; +import { ITLess } from './common'; import { AppNavigationCB, ChromeAuthOptions, GenericCB, NavDOMEvent } from '../@types/types'; import { Listener } from '@redhat-cloud-services/frontend-components-utilities/MiddlewareListener'; import { APP_NAV_CLICK, GLOBAL_FILTER_UPDATE } from '../redux/action-types'; @@ -65,7 +65,7 @@ export const activationRequestURLs = [ // Global Defaults export const defaultAuthOptions: ChromeAuthOptions = { realm: 'redhat-external', - clientId: ITLessKeycloak() ? 'console-dot' : 'cloud-services', + clientId: ITLess() ? 'console-dot' : 'cloud-services', cookieName: 'cs_jwt', }; From 2ce74a8da2376553bcec288ed7c048662fd1f6c6 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Wed, 22 Nov 2023 11:12:34 +0100 Subject: [PATCH 05/23] Add new Auth connectors. --- .eslintrc.js | 27 +++ docs/auth.md | 25 +++ docs/chrome-auth-init-flow.png | Bin 0 -> 43496 bytes package.json | 2 + src/auth/ITLessConnector/.eslintrc.js | 5 + src/auth/ITLessConnector/ITLessProvider.tsx | 106 +++++++++++ src/{cognito => auth/ITLessConnector}/auth.ts | 53 +++--- src/auth/OIDCConnector/.eslintrc.js | 5 + src/auth/OIDCConnector/OIDCProvider.tsx | 81 ++++++++ src/auth/OIDCConnector/OIDCSecured.tsx | 175 ++++++++++++++++++ src/auth/OIDCConnector/createUUID.ts | 44 +++++ src/auth/OIDCConnector/utils.ts | 81 ++++++++ src/cognito/index.ts | 14 -- 13 files changed, 580 insertions(+), 38 deletions(-) create mode 100644 docs/auth.md create mode 100644 docs/chrome-auth-init-flow.png create mode 100644 src/auth/ITLessConnector/.eslintrc.js create mode 100644 src/auth/ITLessConnector/ITLessProvider.tsx rename src/{cognito => auth/ITLessConnector}/auth.ts (83%) create mode 100644 src/auth/OIDCConnector/.eslintrc.js create mode 100644 src/auth/OIDCConnector/OIDCProvider.tsx create mode 100644 src/auth/OIDCConnector/OIDCSecured.tsx create mode 100644 src/auth/OIDCConnector/createUUID.ts create mode 100644 src/auth/OIDCConnector/utils.ts delete mode 100644 src/cognito/index.ts diff --git a/.eslintrc.js b/.eslintrc.js index efff319ba..44f4a0dd6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,6 +20,33 @@ module.exports = { rules: { 'react/prop-types': 'off', '@typescript-eslint/no-unused-vars': ['error', { ignoreRestSiblings: true, args: 'after-used' }], + 'no-restricted-imports': [ + 'error', + { + // restrict importing auth packages methods directly + // Use of the ChromeAuthContext must be enforced + paths: [ + { + name: 'react-oidc-context', + message: 'Do not import react-oidc-context directly. Use the ChromeAuthContext instead!', + }, + { + name: 'oidc-client-ts', + message: 'Do not import oidc-client-ts directly. Use the ChromeAuthContext instead!', + }, + ], + patterns: [ + { + group: ['**/cognito/*'], + message: 'Do not import cognito auth methods directly. Use the ChromeAuthContext instead!', + }, + { + group: ['**/OIDCConnector/utils'], + message: 'Do not OIDC auth utils directly. Use the ChromeAuthContext instead!', + }, + ], + }, + ], }, }, ], diff --git a/docs/auth.md b/docs/auth.md new file mode 100644 index 000000000..3c5eb6599 --- /dev/null +++ b/docs/auth.md @@ -0,0 +1,25 @@ +# Chrome auth + +Description of how auth should be written and used within the chrome repo. + +## Multi auth support + +Chrome runs in environments with different auth connectors. To ensure compatibility, Auth connects are written and then mapped to a `ChromeAuthContext`. Aside from the auth wrappers, the rest of the source code must reference the `ChromeAuthContext` to get the auth values and methods. + +Auth connector is picked on the UI startup based on which environment it is running in. + +![chrome auth flow](./chrome-auth-init-flow.png) + +## Chrome auth context + +Interface of `ChromeAuthContext` is described by the `ChromeAuthContextValue` type. + +## Current auth connectors + +### OIDC (OpenID Connect Protocol Suite) + +Uses [oidc0client-ts](https://github.com/authts/oidc-client-ts) and [react-oidc-context](https://github.com/authts/react-oidc-context). + +The OIDC connector is designed to connect to the RH keycloack auth services. + +To learn more about how OIDC works readt the [docs](https://openid.net/). diff --git a/docs/chrome-auth-init-flow.png b/docs/chrome-auth-init-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0db8605b632f504ca13b59c2828528fd65a521 GIT binary patch literal 43496 zcmZ^~WmHt(|Nc!k!bmp^C?OIK-N+yz%?zD_L$`E;!VrR>#Lxl~L$`EEC<91?AR$VZ zbaNj+-}PJnM>kJq7R+$=K6{^cysm4<=xC{slQ5ECVPTQ0sY3ODS2PwD&MFZB@Ghbw zhXQ!P_R>>%id8wnyorUyj->`wg!x(Qv=gUuy-bp0O@jYavhgZ`gh5i0WP3NTV)J>3 zc)@!-0$3oRSB05;!x-v!iN%%VRU0s8NgBH;G zG!*#?)94f)@V&7<$3ukRfL83} z4wWFi8@}GjT=JQ_QR<&?@)ql0d=+P1vZ=@f&iwXu^cTzrRA)cNu;1f)wYk!AYe~>F zFCjjjS+{CNKg`uW;JbMGoGI#J{`O9u3mkSdpq6}%*4KgRz6zz7UB!@fk+1U{-61zx z5k4=Ixt6x;Z~Of2YH|3)6h|cEGqkz#C+z&Jme})~O1IefQoa!@Qkp44mkg)gw_dpS z3dy7+weCeMCn2JA&%$IUeQ`m-ig3XVMCN71&P!}qycOb~3=#4c_0yLiEW`vZIHVXV`}kLN?>(l4j$r9jLh|MNV;@ljJK+2ofvE@G$+%m< zei#F$oo6RN6E<=xX2oL8m!h}ala>074t1gL!F*?^y;LY*&}bV*qOU`Vw<%)zZG%kz zI-gn5)PE1y9UFS3$3c)l#9BvY%*GOOLl53wnsRu#`{MyNOydZ8OaPYRDp(c<2PC3H zT9!U64xa++kdJClKvv5PehZaaU(~NK2pt=~Y=xiZ6QYrAbWU~U5ttpDk>;cRfq}B0 zdS;zzkHCTt@{eLlvK+R#EEZQ*R(zLUO=zA6j}7MIZzZX)O1jUxG~IARR?{IVPU#o2 z9?X^<_Bjf4OpMB7HHcFVuoRyuIphwfz$uyQZmw_3>v4cCjwo3#q3}_tt)?jEdQT!j z_=YZdtn2b*+fYMGD*NK9aCQt23&6dv!jd}_&XOK9xm?uqkgjyr_jrZJvN^(oniWz`(?`s?Yxha8lv|@&-wW$J!3Y! z?z0&C3f~w0&hjU9RbjCb57(J{ov1QUh1BVC(H7N!VLA?U&tQeBeAdp5iPw{N#=7uD7o7b4GhcINcWtKgBS{s1+sD zgCEyyz&r>Ba9#y9k@=UFFzRPGQ%c=^eQf@Ff)OL-Bh&oO*-BC-Lsy z%QenbiCayk%a)19y42>@h(xhE!-r}(?`P_rXREDqS)_fe)UYhjQ_xq#2`tiDbG0vr z8fCU}D#$?L9?aB9qXT2rD3&hFOGqmN2b(p0M;HopDcpzQ9`GQms_94-B4g{rkoRxP zq`4ezzS0iQ_$zwTfR?kDBhMNY1xFCxi+B^NKgF*$d%T{Ya z^d6)x6tM={pCHCrMBGS$TeRTTyIm!*LVvia#_meD=GV##DFi5!?jGj%j;#Sv@aj00 zv7}f*Q>CLV91QjwbbFXjI`rp|(6ND0rbgiH>Uq;<-H8HzE6HH5TsgXG@TfU%@T9Kr z^r8r5{t_`Gz3!Top8lD0G$7DC71@@FwAkMc&OnEh(z$Ff0C7iZ62mwdtw<>oWYXU?6d zS>lk;_zysE2>VVx>U~lpL?+*bxr0JyGUf!+FaFH(N1$vgYmWlHy9bHYi9b1Ncb6N* zu*I&P*ZHR;dII~aAEUQ8wU6ezT=3px(CHNlB9K^*u`fgKW!jC77Z@Qz=s-6Mn68+N zKdQ>!REX1Nnnwn0kAB|75w%5*Al7Dp0^!y<^PbE>S8KUZ&95fJsWY@AmME261-%u5 z0x>sfNUrahR~RHU+nS8){02fcuAPl%xHJod?Omm|VU*KfoGA_ttkf^4wc&! zr&T?DQ_j__My<>y4#{%OE=E_K#f8XxZUsNGD1}M6yn1z<81i8_f>;) z_N$-oksD6XV_JA{D-!Fv_z7gtvpe{WRqx${{OG{FM;b8`_m#)i716ESw8=tbg0^dQ z@P=-}Kl{d!{QTgEca*QAU~o}tkULY@Dpsv&IudDhiBEH_o$cjUBc`nTDgzaM%fi*s z+%F$PRCN0+ba>{|Ejj3Mok@ky+LteQ zGShWdUtV?YFE1~fi@PqICl>85PkDpwU&BsRfaM;-P@GzIMxqjz8k`KDNJ#j_SyFID zKupEbb8-{tx&`U>j$aflR62a9AY51#jSY zLnXWi>ehHZBPl3`=N#X)w6?jbl0NE{GPB}gi^1QWmGW(Ep^x!O2-$)Tu=Vxz-%^2p zQxCg(9&Ti_p)8(4En)Dm0*(;eH-8A873qQlG-yS@wQrDnds(K&6$W?7i`?M#JpOAI zyzY-SHa2&Uz@OPB9I}zDX%EW|GD}*}d;N-hV0!OdCj^Cha^VW!dL$hv8t++;34IjS zGGVq?F|2Ir(L@p`j}y$Sl_yYM<%A%($==X3A)-*MwW0zEsjjM0aVw`^){P!tdNyAp zU0=(^5n*7n>9>ZCeS@pUBL>g3|HbFk^k$FWKxj4)O?1xo5z3BzcPgxw94(&44fb0V zhTmkPwAFW;P=gVhrIQfRUfOx1)fbU?FRVb=?gR>gA4DJcE95|AWZEpJVeh407qdf+ zb*Z!65LK!(6~LR92ura#UoN%7H8LF!NsPdbYjcz_q4;!$s$D5Mks4I~ z(L>^}5EF&2ImIJ1Y&N^i4QNmBJ`_b?em6Lo{(90O|Mp8y`!en}jZWy^%=1u<F;`sXRE{5GZ&&yJ>(*4+nLygmjPTJ=ZSnJvxAEj=SkI$J^<*6oi5gTlV7JLemwBtL z3&Zo(XS%Q3jH(3FhE$vv+l-a*O8uj1Gih{s+~#Wk(D@~u&e`RTy3RL}E11V=8Z!?V z4Vtqlw`M8(t8}S+leHlVHTdW)?vO zN<20O78YgoY+1GEyGQpnti)gA-n%C)CoC+iTLI(qeYqBWUOvZ7Ic5kuv7Fx;+!2)H z=cq1N%tNa}7eqIubb|92`eB=1zFJ3FJ{5++Fd^px`s^5@fnxI{p4br~i1Tgr--tYc z_}`^rDkP^ctViO+y$5D)tqq`j4FW%Y#x5Y0j|3(3B&CrF+EJG5V(~VQ+SLSqivy?c^RLWLcREejbr(ZPt zvu*xCU*uP(iYyO@Rx77H|1>_hv0=ZUhyB=Wfi&;gNkF^D0-<3Wml~t%i#Pn_*o{^dojT&?MVhhK1V-zMEKa}}w_I3+6hitirAzG-(ikhW`*GX5|xOK$sY zvNBo!6-xv3C37i?ZC9$!gvT1h5#em^J%z@Bv#kw9+M%Sw8aHnGQ=36n{=Q9y3O5fTwkY$H zxQK(K(#n>DuKPaeZI+QL$0s%Yg6M}DO2Pv1Vdt;qdIRrOjG7w9eQFaT>t2>w-1*pP z^g~`>TDee|s9PKkPpWEsG)|QlP{scF^2Qv_#Gp+ZdH$R3Ds|}3!060{L~MRw`rMy9 zTD_^zucux=TfFtkrd}XAo+Pa5(?;G~bF^tGf6jtgZ|V5CABaDxKTOt<4iiW_%iULU zYtoneX?VzWpS|Kd2c09vRvafpw%?0Um4rQo+9z`nNjM{s<-O%kp~Rr}aOAY`Q3#?x zhtsF&b4AwWSi_4aHy_PgeaM#rwkzga;l|owKkAR*}B7a9G5!^VoaX77mEuj9~*?U}<{ z#5ybvYpBb2o&~W6+HOe5D|x)mL9UJhFD;K{o0}KrNZG#n@6X zJVT%*v=r^GZ2GD;g?=nN3BdDR3|8WG+kO+8tRyUUk2k-Qlzx{ ziaWuakL4;-r!9Q6pN2D(i!99iy>`p~?ATVjkj#ABArPO?nqF=g z(-9?6di;TWWe8Z(7wgQ^`GlAG#T1Y>w~bN{=FsNmA3U+Hkh*y|O}Jm2$vBHVBvdA0 zmCm;gB8!VoxJr}$K1T(`FONsrhJOVDsC(N^NAJdQx%0X6%1B8u(p+i4&J zt5;WteVM^@81tnh(6g|(Nc=ARwaK%ekLK+P^wHcgku!cPNQQ1wT+rE{-J%yBeoX z2l5CG70v8TG8eWDKpGB)@pV?-blN|7{&dWx*ny|C_+JzG0O4a@rAm6J5RSZ#M7aUA zTsIiUlT;{Ap^}xARgSpkTCU|p4N~ z{bJaIxs%fi2fyI%@7!&nO2SBUyM7232>avT*bha;xtH>$rg{S97NE;h>XML4!WA6W z#eAaUBmR(qvaLL1TM}}yA0rsEN-umj#~Tb(m8Mulw9K?S$Hn@~RT)5KFF$}8eX*u* zSZQ|A``ENG%#S`b>}XXYWal_NHjl7h& zmw3ZlOZxQT&v2PZH9r{PzM)a&IocldB?S7cQ~Lk|lE0&sbMafHp6%^T)P~W}vpj zRi<}co`SMXk5G^_q`35ZZXsILR9}_N0bnrV%O%vBCOo4}Ay`}8ij?esXXOrjmTGJU z{{GY|nOC9TxGFl&GH1tPg-ZFul|?*8Uv`IYsld4ilrC9R_lUg%E2kdlS^tMGu%G57 zH4>Fi4GgD3%I3}YNb@SqTTeqy0$7L#8L?j=d}PL@d|Ho`F9N3(9;R^Re02piv`?E` zVofEY9c}}7{s3LR)^5X-*vs2o0CSWkj4z-&|2-m=hPk0dRitMHDS{ z3hD8hZEbVm;|;z~zk^!l3>Dtk!JEyVZFv^{jp}l_=jOv9J06B)XBmBUO8wgw=u^sB z;qp$R!T2zFH2COvCOGa62E>O=#Qn%OAy_xCP<;X>5%M5hJAp|8zOu{?Tt3FMHL?@( zUH{83AvoGqKWeReqk?^QW|M}i-$J_w3W=iwrxND2HlOERZfF}}kGB<(B05bs2q)t% z0rD%I-TbhkYKdPkm>9TVjy(d)NeQ!Ktd<;xDtN~%x~yM!CuV9Z$dbQ4pVEQ9MYavk z$jXwj5)SAaJ+nT(Y~hLZVIsQ@JNU(=CbziVh=E&L;(8NQgWpKjGSH2G1c(YTbaKaV ztZ6Sbm|~KlE8y{XvhR6T>Is0%%)s9Q)}_}M9Htx_oc!~p;OF^RTVz(sB_}I!N$8ph z!s*Q$@Szm=+mqVs93*QQI#c>_Yv!3CW8MhX^n3)nM1Zq%d6HcN8x$Jif-sdOR+blW zXd##D-n)v~z(+*|o5Mlm3um<@VHwzuiYjh~%W3htHvz;rMv*}a!YzG`-kYM>Rhy^$ z#~KOV6+M5b0^Q$0v}Ctkb#8=_;D_}jBNqoSiDx8|+HlLKfL;^+n ze*4c30Wu|tE386Z-g%1Qo!z)$X%_%b27d^fhc{$ST%m3whRvIgK$=h*<*`m23cA-_3fH+jUpxXU5Oq@w79`MD)V=Me_XFi~#ryJhM{}5Ntr2QPa zs06*+8rlo^^@bspb-+I?C;MWr2PgyDJ2IPdTRslWeKUKapefA*Uia&Y7_a5PT&t`v z&}Dnky-iFsJTj<8w$04MZMz?oc><*sF{_7{)qe64Tu6YVMLFEvYH z0n9zAF+}>oe0eYKUI||0wM-45zL_Tj1KQe+#@ey5+qfRZkYT@;f1X@eFqr`GMoQk` zAQp3uV4xhZ!&AhH)xx6w_-6YgZ#Z34WIR-R*ueO2%>w(O%t}T9Exb6 zL6s?nEkM2vBrJZ;akGqwJQ=R9 zR2y4|Fz$R&n#^G&33sE3@$oyRK>L}h{s}(P3|FKq7pa4vTO&U6fk!7zz)!(T&3J2# zLlNxf7V;Njn5hk!PRm9G7lU6wcVq~ZnS_v|n2~0ibOv^l!JPnk+qEidn0B%)cr?0$ zeuyuuCAxU+Vhek=Kap_X1VVZv^0V}a_}L#_@DFFiMD9p)*}91<|FdfE@im+h7JI>1 zu*Q6J#vBupM^>!w2k7~mIlPeE%xtfMDM#RGa+eK_p82g~s|yv*UrWRW%{_%aLS1~8NVt1+#~6D*4kSuQh8$#BM!a0JS(WGz z`)}+ZQD3qT(84IaNOr%2+1Xh^&#I3+)e_tL)VN?zL+~Z(H;)mP_VmpG=_zILeZivJ zdkvYx7-s~QB}5U&x#bjXL74Wc-=kqoCda;EU?h; zK<`dJyqU8+qP4`d!%vFlV#|Ss6hP@aeIKSI?b;g5&43T$(l`ubPa2m&cOll`uY*CsI-YM;bFgb>;|B zlJZntvHHoV6~{R#yZId2p#{}`oehI0N&eAFKGa%?3uy1K4hp(X9Hx5)5Y;#g|^I%DTih#Wi43*APSusSKH}bJjW0^HURr~GgXAhE;SmbgRoADVtVHsa-j&0{1D@c~_Muig3Da}c* zu90%fjW0|}T*tBx!*-AstOvK8#rq-*jy>o^P)1q%$w2HPZv@~|sQW~|hh%Ae?f-OZ z3;=hU4NGC_zK5&QK06Y&L#dDFpK$U8>8`wwHNX1@7_vg>{)u(YQV*p5r>s3Dwf(d3 z6{qA#$Nt;nH_wN6%DL18MzClWZysEmmrdEecmeL-x2CT|Aef66hb^yW!f*bbSpAxjp;Y_CBV))(n&|Mdx<+d92g{A{3^akZTTl!DswQj6gi6`% zRUGVu;i#nYvn>HRwL&%_KcF^WvJ;Iv2hC@BMYGHP2E<@;$%w{>n$?-fdWC(E zBNR}2JW1S&eNK|sm>6EPdG|&wIjGj*CU(rnn|UA1gxOk1RW6tUDP6?M<5w`3oU)<0WMxL-AILy%BWzb{WgC=-2r=&_Jjva|9Azr`aNpN0kMyv#?It@_Vak~l`~Ljo;9CLn-*&tJvJ~j z+XLc#gE9|P_m~k9n45c>M6~yrKJ=RO z7tU||h~bIV5~)LdzT|eV-HHopL2J3y|0pT?{Gb3>aF-rM=yHd+>BG&pk&%&SbDup{ zE5+gjU7f~(ARxxU0ls?*WkYTHAVLh82i%>=WgVDd?FCb1o_0Ty3o9ljKUsqGWo2zH~F2tpyR)%QpP(AX`so&prkEPi7q zFiP3=ll%)5&w~Hj?Gfaz7jvr!4YgZyInPEl{hE+$YJl;r9I*ilX9{Tf@|O(Pq$HEx z+ta(^qM|24-~h^N2^0hS!a$mH@MKL~W>NSS2h!4VNS zpi3qPhdN3ZM}B^oj1xaWK=`TiP&~EovhOiLbJH%5)8Fnj-jF$` z9l?&3*!>c4bu^}_Z~fEwo>DHDVs<(puP9?&lTHche`Q9p&l>Tih|ytu+h0HB{DNSC zEU_8a#%%C_1M)1jewG5&Iw`nCC}CCbEI-AZ5K!9_Um|`xNrC4%C>Jv39w1JKKNywM zu?TG0YvKZ}dI>v`Lf&6`a7*aXPfS}MMy>=sVMb6fCDd8gN&>L6ju(i#EQfEFiX+Qe zR~i7*jWgqjQ^ozqh`&poi9nQIDSdKSzBrwnoSXyrywTCRfI0R*+sf@o^Ya)UP5&dq zHg9R)y=&Ff3dyrYYW!0TT%&K2>lVEj3av*k*X{tb&N2VCj|KTR7C`vVIB<&L@&11P z3m|9D0qu$iqQ>!D1K0TJy;sASNz7jES^OM%UPQyaxC4SDBOuipy%;Up(0Wf0)Fb|m zy6VL8Mgwl`gVFTFM||wYYx_kqTG8=S=Yr9MEH`P@G8X zJ3P#_zeqKYjfaB*6sX=6zQ*V`ngbh@@OO>;SJD!pNj9>Skra|3kJ5H~7imUHP<;OA ziQnK$pI!QYfW#WWmLmA7p^O8<&nBLx)(}irm~uCmkV{$*K|hpiA3#<`o57UftMT+-i=RGWgBTuwHLeQKEtT&Vz42fme+tk| zS?(zt+ki&~^5c6knlk|qK#$I`5w4V;>^7J$U%u?_`c&xWg+wE*64=)lejdq*IW_6` z1>bxO=ZQ@SpJ;F!eh)ig+HEY?&nr^8(nOOaUOy!vw-xOIKhc7og$dT8JKD`pUXj2) zzv3|aHH5yL^kLFnXnG~e4jy!JfA~MX+B83*6;86{2DR}yZmgd_|J89j6ZW6>o%q`W zefiqQbb(g~L~ABiSC`Dy{Q2iI>a)k@{{~8ixWxh8n87_J7gK?2%xdWNfiitvrST#2Awb15osm7jZ8onZ(=mAxs%ysL+>wYtK}& z$p}h`XecnLi1^~9_4iEnE%LxC-M2a<79A2ik_n*$65WX+<#jHqolhV!=ip>6 z_d6$JDeNs1$h?epUMfKPz!3RJq}E{)Rw#G=zVK1UNb?z&S_Ea3e;g9)cPM*4T?t?E zh7UZS=dukYJ0W?t?3$dt2J&2goyOsUqrfgIPz(r$7vrwems(9IH^4;x9kk* z`~90M`EKzo(p7&7S9y>7G!JJ|JO+!bNzXetz57l1VtOIFHK&@2VmH}E~tCrae z0*hCSHT_fdVy86dXC9iJKeGu*G~EcP;R>0+RQCLsk@U53Jky$ahq*42NLZ5Gk6rV( z?q5!n)-r_qEi~}E-~x4R^b;=|b4dvaiPcK^SnxZ?;3>@BA5(&FJrt!|zGu{*fT$J) zkPJFXBOwUu>58W^{pUt8CJzVvitfjxYb{Yi zN8HOYAmuTJ5lM}sPJ*!E9sBsjpN!qQO~{~3B&!o55rMeAHHG&fRV}#JfifsJAt7N= zX8!%DT%LP-+cYMm8zXpDF6yffcMsith%yJvZL!`SmG`4o{vtmqeWc$6%pal!FCCZw zrhi;cpDBLj;WvCy2`$lSs}F#` zOXZ&;GA0i*A_v&geW4`BMCfa&KIi=sGzj{w=GP_MV8k zUD0puCdZHIqxxSDz#>Sdpv!MdC61Auk7D!J)937v8=i3dRtw0ofHgv6eSau~16*As z<6&jB+=a52k=3Thx^{r~Nzn>oIJ;>2F*RO$yhjZin8{Iot@MjIKr-*a{I0Dh7V ztOCnsvjj1>#dvZhCFt+x&|_Fz-$=8a%`Uz2m;=Ix0c4IwC%&0dgjzj}sdiw-Z&1QLa@uh0SO-v2f7}>(2Dmf+5{0_a2D%QR^lW83XkVv#^6!<7&I2buK)_Ui zj}A8ucP_xem!;^O*<)s^wshk+C{PdfBV1cMzLvu@8JtLX5q{O4m+9!e4uU~e+$RE=h-klLi0|7;COkR^FP>t z*XH76#uCuN;`=wBQ5q}dor{N>*=qwsFG(cC|@eMR#DeT9ii7$aKY$}H0z_Mwo=XoV)KuNcW8{7 zfW)uJ&0G4U>oV;4(-1#uL?138-^8z}A39%*bit)TrJybz(F1Y2fAc3-FjFR5#GQ1- z+2}~~g!?!r*k~}+vuM-l;jZnozV#R4oj`gdKMA-AUAankRX8o20;JNozV=Q6A2}oH zN`ME2O@r${Q1sz2^oTkf=D!&!0O0k^phy>sQjr&G*aP8;Fc ze$2+zEPkMhqs(ywCI~PB`^B8{-2Mq$r-@%R4yWjzK^X0KM}*;$)qBh?9R$E--6~sZ zm+TT$L(QvZ*ktA87Txz8S_q!`(XX<}iHS|;X&e?C9JB{N#8QVY`HYx{fefKJDo{5@ zdU}Z`t*sQj2UduvPk4nd2Z8XLqh}hDCL_u>Vg9k|A*vrO-Hf^IX}P*WdrpIy zm}s2OMu`vA4#%B~+jeOe^#{4V-^e>SZB}#CK`(xM|Nh;}PC5X1hDm1irE6r1TNJ(M)kH%WCKtZ#Z_W3y0OPYwfh_Y;)6 zq(7Z*GCRVEy8}LN5lDITc%!v>+!%Wbpa&%WZC#a4!BJ{QS)-q;w5?s$+>4ZLsGz!U zO9h;F2&}-Je<4ZMYqRdz6K;3i)zvlOySH%h)zqz>Mn703;_%_aht;&ZynplpCg1i$ zjxtvz`irXnW!_R208tsjg-QNAyfvcGpW{F@Qlyeda74(uRzARH441*dkl{-DjHoL4 zXP(vf+*FetPkxma@8j=@aF=pGbpF*0Ekk!yWV`-1iF!Y5(9aSyYJ?*{)~1`ATE+jlAItW$=^pKOax?(<&U7^CIt=h)PHxWqTqtZ>p5> zctAHs@D(N#)sNxQ4p;`sfWx`)>%n3X`rwbf@sFI#2~LeH-7D3vsgDF*jV>7n{p=pc z`>R9U^KrpTLogatG%zTk0s=i85=fv@G8elhPBGB0X2FlV?Q=iR6K z9S}p~VmcEtyO`@KKvHP_lM%zV}KANJyzD4@^k$ z#^S~FjF^rxUd|HIe=Fb_HJdLkn?4@S)8(SGa)h15J}Z&ll74Vw>MW+iR3J@WN=k~c zSRK$U5-n<8^tmk)Q=}=dUA-9$EAIDL$jeo92e)ki%3`#&A2uYn8?%q%CGnOkWRPp2 z4(N@sP!I6|j#eeI0-eA|_#sjww98o{H-zmE6~8!D(G=>U!h^ZDRPyZj1dMZw*Oor2 zk&LHX^Z5C^f~HMsi){YoEdRSa{JaU`h-Ej#DNioxEjwj}zu>D`@4u1mbXXU@MDHMw z^MVL4A*nwU9^ptdXQuG`zz?K|@#pkmg;M9(EyfTHiYCCOZlHK_A9%}7K6vdd8V~GV zBqIPU>!A_4=zl???ThyNUM>?rDSao3G(!Pt7|Qv?SkI8z>0}f% z9Z~O3R>yzSF-%h&M2Z<{L2VyFA|Db7>u7U>p`XD#uCGyvO7?L`cARD4Y*Yt|BN;oZ z1o;(533E(56r=`uqQUL{U1F+<0!oiG#IY8fweorYVarqO5NUAPZZnWD6de^s`O|$H zh-gu3l=QEwX12XYI5YB^*}yn2>Zvl7+D-k5foFor!5Fh+s+KI%k)pmH=)zb!hncPc zEM~#QMMbRi10IojJXC7UqC^o_32)zGhfPFm0|`*kK5!cdOuBLjvgEqWyhIVe`LtLl z%z^V%rmnIF=0^x&>jY4kEpTdr7SRFJV36zQ5W(^IdKp9r^oMKcoz(h*dxHtSl`j=& zj?*9d=%#YYQJX(SJx?zq>Aro(Xkqp?^!HVs+P5g@CKIiBg<;#&+XQsZqGR7tvt0J& z+KX^1P+=1kx+SvxjZ6W*v@aJhV8)yT$l^blj?VkeaAZX=b4>_4X+U8H*_--^-a1ef zNX{N^p#whnT4&NZJfl`_vSt`3NxT7`z-5(mx6T_(_`8D~Y0$+>YD7L@WyiKRO>GR% zxUa*`2vNK5Y~h*q0o||NY&SwH_(%Us*tJg(Fu4%ph~-EMx%05nQeNm#gb|sCk(H}M zH4Z{4NtS3OCZXiV`)es$H4&eqwv3%9=U*~a?W*Qh z<4r(tCeGH_L_bO!I@%RKWU-Q6JVKIzy2rQZ5ptplHs!;nsajzqj!NaLloYpvsZKcq zhj>g}#^ZH+>O0z)K_ zi&f6oT$*d zKJR8k)ad#%R_bAkDDDVB$FZ%WB7HGLqem8{F2gZbqevOXgTu-H8Sfr6Bn&w2vrx#@ z7IwZFKo(e5$Y9TnG0rikTv@1|!Rf-Cgq&?%So-w8!{I&Hl7$+*VRcd{YG^gC>n;TO}h&Z{$cxMUUM&JKZ z7xec%W(PslH92iHWPw^%^k}+snV;($g1m5i%^#UAU4U;Zs@3DzKxVD4DqQ19+?%fg zyWu1WTGi@oVodm#zYM*{BDF-`&Ar;!f#aPwJaDPfmDN$SCp9@%DRtyLQs#I=P|K)# z6b>4bUyhls^pV2nyRXFFxds5li>Iw`dG<_Ofb(S^H1>VqZ-!o)j)QdcRpPXWOy(WE zJtp$U0M`~NNwV0T8hk~4F7*}OYEkVHYWE9a`>Ij|d@p|Y2r-|` zy&I!{$IJe9wf4DGY5=h!F*?>cvbiqd)p32`E3f`ROE?_!#5b1Ese#uYi)JG9TS~_C z(xB~vqYdrViKfDv-Rf1s`q@{&0h;HSou}Z87i-ZC+he&`lZiMtMI^lJ#rm2)_dPz( zvTFTU^JumQsW(dVMJSeGf)qz+X}$hy6fH38R6!SRH8|g_Xgf z4+JEE@z~qjFCqHdK8;(u^OKR2w-do~a_~Xstt}Q+xnp02H*=0BX!7!VfYymndfm!W z);)?KC>15>kQQBH$>v8}0)Xnf;Y{(!HIJ{V0FSgq6gmcAgLdC<&PKyeXnyY4&xFN3 z7N8$8=B1k=<%h3l10p8u3Iycd!8*H|EpDF9DXr)U9S$5?mp zpOly&HkmnU%CVcShrd_D01GGe1rFxSow!Kr(8D76Cs|(b3$# zyFWxzWF>Ld0hhp!MAVtrNOv$5mtWpoeC-MQ7!jylFu}$-zm?A%-|>g1&R3x$(sTw} zi)il#73CH4sW7{nTitdG!hLy9tYc^Z&ZM($u3h8*c>%Pi%Zg$!l4pK%?7|1uG*XNCF#s7RoFHE5C{rUK^29NYzu_v!zNoo>Afg{I z^X`vz|CCV2)HKJTO8~`KuJU2=hd_ZD)o5n8lsOErGBy0DNBt0zlS_D|@aFe_CMF(_ zqG1>%UNleuaXfg*A^D#%OFfIY1o~=!?*8XLMt^E~(O8ZNi7j83L;bw?a+u3Ze3WSv zhW{psSLi0vv$3i4G(PqGCq^@WkeHYp#ZYX#xiU={-rvsuHy6KJPQDEZI1Q@g|7P+_ zgAa;`rr2k>-0mp{pG!!$CLke{aS~&my~eLW*e{a zm;SVHEYX4WMOzhFz|&IZ#UEl!_wP3YOTRyO{%46w=o9?k_0Kb>OSt;2d#s zub0`OGT;bV1sU?CP(`qJQQt;)cX!(WdL`2DjNy~R+W>U{`qW-L)#fL-UxS`N zFO;iOZNW&oo-WjtEB}geOa(^6+e3Pz!Y^UHV)qaE>By$#dwjDT4lS zaa~^e9D`c&|Hs{5{zdhE@Bc8}HFOFL@FFB7rO~0KI|Y%UySo$y1eETO4rysAK|mQm zx+JBfl?H*|iSN(%`Xesy=mTLhvuE#fueFZnahyeVakOdoaSi*~?L=K!b29A8Xd<7U zY`*`8&5-g&7uZ&1Fq18IJGLfe?v>f}y9FvY`2yVOj0ctsMiWo}lo03H7*K9lV``fC zI{t&}Y|`g65?TE&2w1qrPmAbFG<2tc`Ryw=qjV-KuEO?{&GP$$>yq>0_Z}G`|33aJ zokR$@tVS1?=j%y&UgEzMinSjDQ)mB24Oqjxp^5ECecMMAd;GW8_f@Hdy*=K<-K}9w z1((=fsXVMZG05j{p&wyp#u@1IiEZD{uZ@3}oDv6^@*9}v$g}bed5pav2Td-)Jcfba z2II8jc6o@UiV7Epj?IlAMZl6=`~?yNY*I|cdQ%bLsXssBK;-JzB5szq%67Vbp6`8h zfy+~Sy%BfWZi@>@J>`jF@Sa@(HZ%Sk7MlG4JqkYyIw-UY`}eE6W10&8gu4){W*0ax z;kj?t>sw^y0N^EZ?GbQ4YwE2tD}}`b)+$~J?|_0tuAU#|LUho81f$0Y7#^vbwKnRz zic#$8NJtVCNydn8PC^_r<&0n}V|OHXcU$14J%;$PLW1%TB1FW*%hx4Y&Y6yd->gGa z@1YhZC}M8lAjsbX3?=oDf#H0A{3@<8{#jAeNXEdwuS6c@Sf%1r`XunhBe;$3x7J>0i@@93uJ?s z44HSCIhmnX&VmwY_sUuZDV2}r@t^ia0MLvE4rdCV1H2^e7h`0w;I(O6#-oOZ0`sI} zuPd(j7<6@h7(ctov0@_V-A%u=1(_Ni2Op8uca%_ZM23c${jVj78RK0x0D|s{FYFUR zYhtb+|<7kvCJZ*l$sn>2mExFkPUF+`-Qz;GNHnD>6DjPJ^hA zxvJI^KuCrHeY+E_SsI$jR4|nR#ecL+fAR);PiYQv#Eb|D`W|aA>wckXRo0ss)t6km z&hR?~+F{4A;~??~w{({Ru8$XR6haKmg`zYn=nBJjF1$NH;PrDlhys;#)?Z_U3szDdg6CuRad3!XTmm%R<-+=Jo(WgOBo2 zzr(-4fv?CwN{AE!L1eb4(e(OkIgEo6`oxhUczl^I55Ae+`a2{r)9CE{m&5Nnq}K=% zE6Y58Z)oyDiXljFhOqJb!O6G-VtZhumGL~Yytee-!3X@nD`qgy9|S5_e9$Wv!BQ82 z>3}y1>6fA4YNCkk?i_OwZn)!b$Qfxh1JNn%NXMCfQ52&&e^y1#g&G1d6cv{l|SBsLLs>R-GqucEoFk%p=MAJ z2?l!{NXOx+si$ho=7=E@Zcw~rv7&!jR3DeY2cG3u-+?vyMSmL;2~QjS^O3@+zSHE`R;{)qrFSyj|W-WS79P4iMCx zA9x9+jS1h2tL>O_p({WEBgH1GD2qqa!+-KxZefnJb{L=M1r0C?;Y&nOG(GlNTz}7kHtqdXB54Rli@;C_f(l@ z%G~r5w~%JJ?gQX*r$CJBO)11j=(7>$Lyr!a4jtwVD=D>YnJUAOBX^?}ZS@TM>!`Zv zC1?AS`3vel-vm%bVF8ybu({$)ghkuuc^l_oYtoHiZMZ+4zjruHAl7n=tHSgu^$Cdy z35B0{%&Xnx(rGR@b&m(b8NGOpSypi(wN zpw|Rf@0rht@E|rQ=?&I1GXEoZI=f&l3kyMMCWT@n3HIf$=rEFQ?0tPNPSke^dR>JD zdwaLkTh&aa;cmULw1|Rja=~_bEyjwr3I<^>jL8ThaoZ_?hB=kZK5q5_v)vC*|Byf~ zIUx*PQT1ye>!=o_pFHCXNalz+Sf%jt61?^h=Mgwgaihc6uq3IX3$}j)Uzmb~;L~*!ZPCtZ{Yo=QF|n3Liu?QqV5&vLVy@D( zV3zE6KYFI$*dhrgF0 zXo>zS2akoI_6?9}ppp(!hYgEv+!B#jf%d{GJJ?dkyV7i&kG8{EQQR8$>@a@p1FmZsyqxSdlbc z+o6Y(rhF;S+b#Q?U)~u;InsT3oSssovs& z8u-_La?qs^RKLHk1xK*VJTldzdD1WU#NvC1TC#l4>^abgCHNa^K#T=g%w3;nq6s!` zFmu8ZS*cS>=Fn zsfbKGm?`AJiihRm(dfn_c(5w{K-ZT>=pTIO=e^%NGN(4!8M`3rhov@y0`jWD%IQt9 zcB-q7dC+#hJoJypr)N1I%L^fmc5z$)nXQ%IO1se$1Asf&MRKu){or5n`DvSCX7jRL4&RA$k6Za4s9XBg3;NkRHn(Mi7i97JCCl z!=^>?YW~Ge@N}I&h*HGlp+WWE)l?o66jDR9k+(lD^p5R3{MD!*HE;76QJ=rBp#Dv#U9KBX6pk{7!VcC_ppG!8hCQC~%_!Df0Hx`P zkMxXxu z2dvJQ{eAof`KSTcl$OvJyT)hd(c>Gk`fSdxGt=^PFtj;Yrt! zy=cPmym$QE%8Aw1%D;6)M7RtUS205~O4;Y6zx&AGLD7Xnu0XOW5aZae@U(W43A%216XS8D)R6dX}n9t4jCALsT9}u z*W_rP_XIqu`Z&?@V7V8Y!Snk!Z-wvXje;=+f=B}R2hWL_TF;j|QAT)YlTD9v+s4xP z39MYEF4`)jTXTSns@0&*sftpzzg@EhKq!1}I}5R>$AnD|t|9+&NVdP$xjbYz_qOLY z=>%M~dw&x*c(3iF!X+;SO^DGwhj=)g4gY|NH+SiD0NwfAzGn+dzQ6foqyY$O%muf+ zz%8f>XVuW5Xm7q?eYnv(&Gw$00E?AkB+5?5c#f|GA?Jb7zhQss$(xFK3pN)$akL7b z42L4Elm0WQ$GRWqo7S$_3cxcwc*{dmO#-)ZzA-*DCj0oI{s)v|rWBRprwWRSZvCb} zt=}wXEDb!j+2jLF_=kVLr{VX!90~pWp3<0lL`*E%Sv_fKjT7A$-9~>mL}C%z(Ja@9xdtQ zY3se}ZsrDcIklF_^i6#$GuhRxvR;s-1Oq4}UDv3&L+9hK(gvhx27Y1YTph}i7}aIi zGk7lfoD{-N9_V4p^(H0@kps3rj}3%$-}ZyX-Lwt5ja2obL;QoXV-a9 zhG_c~(3NxA+wc(NZe7<}vi62L`~VWqkM;Rf{crnNb+84(=iPMj80!1{szFA23BCo^ zU#)h!UL%P1s1D2jH^(M<`r0*V(txbmGZh;^7N(2}iWg^kDh&^G;A#05g z{tGJVHM)N~aOlbud>%f0aI^L{Gg2zw$?#6#mu(X;Vj$f0Nva7)nhA3%aK1k2lPl*6jTDx7 zk~6XQW5rS4)spZN3P>hr+pkGUMoOe?=1><(TxQNL<=t5gR=h(7X^W>G!GR>Tb?L;B-Ds-VtU}e#)QYaX{TS zX(c`!DblQc5E#t{!%$6_DKR3JU(b?uW)v_%6xuuU;joWb!N0qM%+nPPrKj4tH5GYh zT6ym)plIGb@-TCC7^89RiZt;g){J(Q{;rB?2)l7Vyacd!6G+*;P`eu}crf8RbMip=Qf!cfpxaWo}61Dln)<{2wOA`98h$rgh@kJN5Hic9h*C zn~STGXkk#aGPSh)+5F&iZiK)Q(Vo>bE2&_@vNQTK`%Jjx*1zKc)cDVx!=Y+EYk9@T z<)DO=Da@%bw)4}Q<5*3J(#9FP8hnH17-tWo_!3~y4_|2L5lR43jI#H z7!>`OS~L{$bmBi1ypX?%A-&3qQU zupnV$hoitV*f3@F-nP?L8}b4dev74G4!I;%5(1Zw4)D;w!6|XK<&aLNdb>d&oAb2l zG#ZGxCzyI0#OXABWWP2!)3%;czQEXvn59BKqIyxkyZzG|g`%1R`~1y#DP5THT6D?u z6$J)NRRlfETrcT1~O z`0Qw?7V>fv+iRi}yb5yh{8}3PUJ_4{cBwhr{#j3p^LUn}SlA1;?NE|hsB&U}U+y^x z1hrTqd}abph9{mjJGCG z0laya>rO#ILF~h?>xB5YzMxyVR@2aUt^zZHk)sso@h*=W=bI*Z$X&-*&&Hl0E9 zK22O5{2X&Ys$CWF9;>$Ufbjk?x_1?hf%)DoGu4spO**2ptCZXBiaWg1`mGuVq$ed< z`rGi6jZ{?KmIB?6(=5(?oUF%T?VJO5N5pWf2FrnRg8UK(cB+rfR&&IY=ov%W&0?H{ zWdYZdGMZ&`U*Z}QZ1aQWGHp%|ifE-!g&AKYBGhquNhEC3vN62h$;LmCc>&);6;}uU z*Q|u4Jl}fEAnI+(a^9Vo6dD(R>9ukYEhsD?;6`w;U-ayHH`)0mm$bh+if8Qm7P|^I`>d zeG(Xd@p?(d!Zu2W%QAvPRqNLA;gS}#Y5sX?Bt;P91YI?b(TqP)M$s4QXl z$}@;^uS+SuUa7`@3t8$PbPz`!F8dV+0(@5z?M@D(vW@iRNBdpvRei(A*lzQHs+*V1 zpFKzSIZ)}MVx1-ra|k1Zacw5s47Ul|XLDeDJUZdjBJz#y9Ae$t!yCpa4#pM#t|uA!CiNU2JL7ve9q zX*KuD{EM`AnjhEQ+4=ilNrOgqzU^b%=SDa)?mB^{tLn@vvZ~88Jl&TE*S8H24Gx3v zdVs8=c#s`2+0ma~8XBhoTWSlsKBIH)y78{X<^8pOeY+67Ex9l#;j~vLgke`x?wLQI zKp`Pn>q~F(kUDx0bl=QN-(`#FU8FpRW?)(vXwhsLAMh_r-Px0EkI4!++Uh@Gonw}j zWjF5JHfithn;5)=&sXv7khRE z{uV7oN7YOOZ~}u0g<)!5<>iO6PN>|r-m+I&8lohSALJsy`XU%|Cg~#B37E5N->^1# z9$2CXofev^fQO|bcT2BvdTMUYC=g6n?db<_n3HcoU{?_1x6TEUr+Sd`aC|-3%G!Rk z(pB1>I*bW9b+H(%acFl*gq4&NtQZuH(}0ceohW{b;D<2#n5!(mUeCws&|MxGa-^=-%6VGYF!?+U1{dUPzRw^}av*Jos_txpR?=H+AkzDP7#JU`K& zo}4t)bXYYpF>y!({$yrklmqsG(DLiJqsYUH*q_uxB!NVBRS%UDSNthCteT_C<{ZPN zJvqvSD8TQ+SAaANT@`&XT0(QbIc*|IN{eT!Cl&+ ze)|7dfEZ9Rk-Q%*=4D$6oiARY3~+q$;)Nd2Dz$%VkF;NFPIdgJiajaqsh2C)uYRLJ z)LY9g*etE|Ea-(YqG~HH)y>gjQ!VB9Ur4q zqOu?oFw|#{9yC1?hKhqQp}t36<*K-1`QDr@UmgJ2LfxjO?=T*`+GeTOi&xek#-er(6O6?3&)$Pa45H)eH}~$?*qG(O zgNdws2F-w^?q55n}%BfL75`rF9f>(zS(*CTt*(Y1>I%a;abEl=gGbQ zg)rw>)VkjpBD-v>;EMuY$>58MYh2z90$2m38H{&Z8J9+1ay@-`SW&^*x9Fut=gJzG zEAQH!RS7DaH_!U_qDQEY&59>E2Wd~qjtV}@Nlf@ASbsB<>|axZkw3U&q7|1!WDKZLHJE><*l8g!T|hQ{S+ z<8Q1Vf9C)Da#!u=&!36`x#tdld7*FP3${bV%f59l?u5?ErGemLe{1>y&R!-+hX_IM zIXTLX5eUmEKb5v32#*L`bd?fhoR<^E`lAnCar+{5#D&pYY&|&Gm4FImhX!!S1g!3Im}9bWS>6(r}{ytnsC*3-Hj-5$N_*X3nvGRoYw(%E0r{?Dn%? zrs>(f0U5-wF$GkEAh>(ApI);8C#nl5nD6AN^r%}D>A}H)f};Osu zpuPi&dPM})1g)o5G20zDa+;ZA>}9L=PB7FRWHVUVJzPTh|q3GYchco%c zB8tvX_r^ER}y#|l_%w-c+Ur$0XaX&^`P3i`s8MUW*?C3~)n_tZ5>3gI!P z2yVxBjt6^p;_zTsXPdX>58g*L2_6q-3Ok&+h-CT9kDWj)sc-Y6USR*x!k&E4CZ#c} z3R46#@_=^A;V0)s+?gD3Aw5B$=@999h~CH?8R~ctTwH_=uD9O5;clM zcB|M6Lxvsl$E_%^*4)6M+UL%1h#?T~qhBX3gzEJxmd%FsABknz*q~9uv~d#t-0n<_ zKC=6D3lU6WPhp+#nY@9Kkr4&p$kJ2fEVf{N9ols6#Z|t9u^&30^>-4)>?}%+_Hs@I z!%h^SS1%G-=^UFb7)kf`4s!2L^uH^n0LQNTNpT zDQ#mt_ks*O#R6V>#~MFzL(h1PZm+zU`!mb9CfPU(y+UG!Pp+S+j1323L~XUAK zkmw=Isn|_awlS#1;MND30{+02mt2b*3nxBs>HH!nmN*^wJ?+cqH_c>Yey!Xt7Ms_p zhJD@e#-T7{UIh8!*gyUB#m-?KeZWQ8W+YWyu0# za5@KI$?KgqUCm1krm)Nl=<(Xz++6Fj4IKXB@1~!5Jt(L@sRBM*M1gI6 zHYw#uv5V~M!?x+GQ>goBu;}NFt_3!f=4?IzL3*m|L>26c!)uTffAswaXA>!;r*2;y za!FI>2t4_!4jtBjUmOBLP%2Q)k?Dneab6kTy!RSpm0^?PoNvRNX>p@M-gL6I;=|&2 zWaX;k2({7j^v>R_U%7;g7MEt6K)!(^TUCcKr`K651fl=iUpk!>J z^mH;3l@yR0f%u;TBD8TbDS8vyp?DJ_(6(5_gCxCYFy0yCJjO_7`bAUYHPTRgu!h7z z6UW_NNM*5p1*PUqOKeFRnywXcD@EI80dG+m#)Rc@KxuvQ-8^*wWTwr4d?(D7#KIk@ zJ4m;zIcTJjLZ6~O4lJGwnT@enyi5lrp%p9*OBe0z2wj9&tP0(5nM599E7A_SqN$49 zmCE>&H};KJh|}Gfr(UaxNht9tHQFl0tghavi($bHWROz~-R1L;C$JTqd!uInxF6$k z$PW(8=1J4RAFzkXfAr%V#U-$HX7FkYvh;ljCxPP30zGmV_Y{H{Xp-;BpAK zY#dFl0^pG>F9*u0@`L9Ojyijgc1L`mTiZ+s1@Rgp5F^W)oX^PRLtSk%REn)rV+RhO zD9A-+R=7k}S$oJ~3h0ioW%GCX_OACqh|c~;VKdYzYV_VWH5|ol55E21H_76wm6D7l z&=@I>>3d;2tWEoUdOgW$ch6A9YC~$hZ(q zE{k!Am)GTl;6+^jx;6Vz;FY25r)oMws zbERZyY4Kt9Unxl>S8I?2_4A9F;Os&nYW&C7^)bMh_&4i+r;uh3 z3!E(k84tQHEvu1p1#7>k%k<~&3@(QEa2<552%cymx=i;=h#aOZlqv!pd+e`>aFGVR%2cH-LQj(4}=FwaZi6;&v%II@)SY4C|6-Epmy+hcJ1qw)Qdt@uQ@1 z8tPsUm)IOZ9M8rcASrm5CIxn#@sM99!Rx5%6u@EIrFI2&&!wDOxFY3vT zD;_PMKZn5>&m<3PK_=0UA8udfB{jh^zwft%4G57}_-!VpZLNdzS?PXyzu8lED9iYN zw?`r9DdZu(JMAi9iw*E}gu$K@^&Zi@v0l5r#Yb!xs+1c+{dK7$U3>fcaj_mL3LMi< z6$)%_sFa_7aocnG(NZ_2w?XMwreC@E+~KByRXN^Sh<1g`wLBDj`n4vVq}&gYlKLwN zttM@lTnbt(G?MvawxMi=l`ms^I5E{9E{!7Z#(BvWzL#+F+iZ&w0+gxs})j9 z>fGh(rD+Cq?#ZZ_!9$=M-yMSUFuI>>rZN+>EE9#0u1bzce@xh8B;|=`UXk zV3q2QD*6sM@4#nzsW}^1UKqZ~8A2Wz3~)#*z+7McMG>^hsI&NXeBJ!R6B{BWNYLv7 z+#%jw85tQfoW-?&jo6@Bh;3Tvl_7N`PPw_tqkc&v*a%oN!KzNf)IxYa!7}pHSGneOcrJ>bP8{h}o#sIQC>j0*%Y&XPc5@+5DmkMK{D{`V z>H_B-4~Z5qw@=COCfv`pC+^rrr-Vrn`5F95SZcZ`=I*ey5Mhm(E{iYSk;=Q-e2gZkk zqwIOiox$bTwr@3qILGMBdn+iIW>;({*gstoU064=c#x=QC+1FgeKEkbN&apEI zp+3L?K-4#J0{q*)A&IP3xm!68q2I&1iS2lV_*FPV$s}t;6|_8`sXs`^9f1}w0`D@t ztsY=6)L{H{=3kK-whyyOo%#F!R%+vEwXkRSeM;hP&$$XIOZHc)sgv@M#gyq@0A|48 z+H{EWCTmG!r(%bB*Kjz_%I&jYJcU6wDBd5s56~yzq~$03=OBt?hX52Q2@1<)Nwow4 ztfEh8Zw9@l8K_@bq)#tdhQ&ij3;zxvwi^MfYSSrBZS_cx(e|A&F74p?jSC;D*?Dvky)Q-)=$*sx~;NuG{=Gd!AZ$+#Vx4aefc>JGW+JJ!g*>)xZ+op&nGHjWS> z``DgAfYAh7I%8b&rY0f-ecL6EXW|6De?>DDlU0gi-&CE(p&n=qF;MC8rI+*52#;iL zkYXyB*qgldE}q;3wX*6|LpZCImMzz&Gcpsm)vuYMVMS4;%g(Sb6 zzI&~`By#v3Kn5{S1-Y?a{nVO)PuksI=Ug2J1wSp;_QOc;lt|EN24NUSM376-;>qXf ze%9=lp7^@YY)a=FHD})ZCMc6D9ysts z+L~8k1UcW37MHV}G*(1?zhXK<)umH2>h$}s#Im&S7RR%@P+6R*BQv_b6J63+$*#G5 zoW5%D?;z?f#r>-WK*Jz1->f~-pBW%bt4(7=4VD%&m}7W7uQ=XVVpjTM*%d@_8aPy; zZhA8D_lN#nb*s$*b=B7WW;D&>0*w!$y;ctyCyu==&v5&`LwT@#d1oTiQEOuI~; z0QPwC^1xFt{=jVT!SMG>6fT_bEyH|gkj<}Db!vjxX7fJ3Ratit^%tAIMQr&o#{Hz` zTWmyT=b$u^c`R4ks6Ir(aunYD!YlK}z7&G`+fhgU3h&H%rS=tUY)JI_j*7~-cjLH` z+f8$(dr`!Cfxo|q?)9gAyXp6DstBnn_`D|oTg5XgY3(2zz$ZjHYuhnYt@{4xPFhf= zLzpk%(V4mgp;aU3%$6R!j4$mo60rWqt|(aPyB(fn$WYZzv*^@_ur?< zf7Sf#xi%|Z=FJM2Ni~3)A1%K+cQn5=OL}*M#)^RY#=ItZ-dcfkR`2JlZ3@4kD|6bh z{RYIrhsNObqoX5Hk7wcY)aZHylls4sf7lrV-}N@w=u7>(v5YK?|MMEcn+?*zP0-6{ zxjt``7u2)}HXAf#IefQ=e=4-MBA_BlOITLF89G_QYv}MquUYf+inb76=-F@BtNhQt zW4w+cS&TW^*^ZO;!rP^c1QdnZcnWeLti!W4NVQdXC)O;9inp>7GIf446uqqs{qv0@ zCZEc~jyM(U?Xvxl-r{A6*X&0*wp6wc4R!ryuINSz$A8>fyi-;^+cMl`c?z$+)gH{E zKw%Oh87iFguPppfp$UfqfE3SL6Zia7f(k(;j76`RC`Hr+mm*G8$0J&#N$%-sh3?T!~50RuLqkGk$dYsnD`WrLu@d zp?_2Ra!2{CaarU+2^&jTc3R{gNf*7P{$?|lc1$jgAfhkjz&gh0Y=CG#U_}8#|5CRC z(Iw^DtNfrm-GoWy%v_Z>!w=dv5x<-v%5{2a@;@v2~0Uawxh>q{#OoR|B80d z70^Kc2>;mjTk4A>r2E`NJVysA9?Bkm^Cj!)ReT|w)LlMMnvJVZOUS=&C|%mRz70yz zjyieq(frARcxq5?K!uLM^?hk+Ni^wEm!OuL6Wj0I&6kkNtVj{48S!E9YH$AlcRpNZ(p;gXqe>x3T zyDHQuuhs)Zu6B;uu3UJel|t)Xs*(?{*-5oj>L$x^;mxvYRX!G9meycRs+jQDusjk& zy;_c_u-~-M`RA}fTAh#?t_(}c^iqQP;#2PSTJB8IJ6h9Z@?S1wI_Ho|-?dMvITdk^cUMTyh zVzjOTx_HWsq-;m?G_6R7ibIfZhj~<$}60JOpsUXP@#Da*Q7N zT3v@>>VqG!6R#t0;jCdgV3=R!m`$6E+cSBHHfp@<_B|xum}+?vJ^7!2xRNev6!S+g zdOM$0`QW?poeOoO5l$LIuG~iovBBuU4g9eq;2(li2|pv~;f+(jibHe{9XI3qWp7?o zsT22-5II}3l30iOqP-`p6zNqn-c{VX$>n#Ywz4qB9&hq;?Wqlm?*d(T?C1m=c{XNg zX(=O+c71w&+xHHIgdq+xb8>?AKuiG0$>~Vjf^Lj5Lr)t4)s}6=B@?E+P zHzlzelwP%UG}6j2zI48d+{0@S&#hr}o<4-Y;T3=LtyAy2A9T4>-E^f;a>Bd+G*y74FXjc-9wQBfgm&?DvLFz@lJXN#ShlP`vT6GIzq zK>mU?&ZvKb^jickcykU5@!DYTsIac|Q`#?Yd}>b{+IR~o>*L?p%IGR99W6%@ZfoiP zcPAkzc-(hC#Prz2kJJJkDIc(Bou?pGj~kGI>Yd>(`j-W@PR47oDJ$a)z6Kg zD6{@1?g*qb_&c9j9QZaYIf@*n#f_xWo^+(rl4E$~#RA&yh|z)ldRk>e2=iw7Sy&Z} zGv(0*PaixDKZr0Sh`!;;QM3S-dD8VL_EGGAww>>GT4yUg)PpiexOKjD;F%b57_H!xcj|ZJYqp8>O#n$=bwvDhw=8V7n-+I|LmR_J)%v59G@hzc#p)BYXXH zMrdl^H%hmg*F3kf={wzi8%Thq`tU@j{ow9?VpI-n7F(Rf=1zp!GG^tvyn{8z3tu}M zwO#1|24IqVVjyK*%H}!pNkVkjC}uYVRN{WJP3WgVjDgxT$IJH<@J{A_>SxN=AdUy! zqf_G-Pd_yZ?)f1GmleS$Dbz{7Ujcs#DIijVS4~gTuq{xyWo+P%>UhPmY$d|dDBeBF ziLr2@Yp`B&vy#{x)p$8Sl1PQ+13lv%0s zurzl5&784enllRNJdv2}=V6RTSVjvC--F?ie6yy&6LS181uq-7hXQ3O+}hB-&n-}d z`o*SQZ$Z6FhfG)3m~jmVZu0Ha-0>AmF%UpDCymVV8+!&CR$9hjMCoK2E2^vZxq{$D zB6}g)jM2aJj54_yE~U1yVKM0br~;Li_&(CJv0S5PS`fBL{85c!Ucb%_s=0#*Q5yuEi|#6tI{R^}Frkg<8li7RsU zOpZq|xwLZZErF-QYfjC~cdJlAwEvS4=V>Z(nZc!e%kMBsFn>egGcN_Rk27yYNAFnf4m&91cyoBx*W#t}oU;4Jw1Va%(u{0DV|7VMT< z9+In?lvD7YtkWA8^aE%3PAP8CL9H$4R>gPsV5g)4vh>L(Ls?;-322<&s`>gwuCma$=ryJJWKiXqc) zb7E*rVu)^Xs$nFOK8mOz*5Ba8WaitcFZG?e88oI^uM?*NLvyhlzPH+PGwF9{Qtg7E zzZ{0k?%=pa0kMki$Z)EkR$An!hUL{Wtu%=q8<)az7*Aelr-U9_}HEkZiCX zr615!K)z4D!VtVWenQwFX)Lzbn~(BNnze!KOE7Q|-hFfodz)t?GKBEkO1VLkRbxpy zU!-7D#E;L{XWH4BAEv~=1vPTjae^566N1^UTNzB&G9MI+503@#EYJlNqk{*Tqv$_r zo={%9(;Ip2jLr44YxoRHe;@1HD8|5-{1W7> z)loJfW(?#8WxGUvohMG==Q#kZ>A@C8k@~0vp}vpn@HKutmQ$*eJ$mP-%m*ZmMndnM zniDBXdw6Upo~H^_lRVJuha#BTi{r4^QjH!ozO|t00IA!XPqG-=vp>VR@cYJ8B*(}T z@Ifwq)K4+20ABAV4;F?lkeWit1^0cKOZdsu+)HF1g zmRe4VMyEflWgA&v7=7&QgfVcca`5I!siL(G2Hmj#`O@|b=1Px4@l?aDeT^$b!IKH7hCnr@J09!=7jv0Im zx;b{P*La?ygw+`C&o~dQ;PjE?>I~=E=u>higI&s(kU#V?{MwMUy zc42i}z;+k)B$!NvH2!4%l=Q7NAT1fg!ZNaO^~QwIKjve-RsJS4oGC=p^k-i&|EP6> zN-IEr!Gw?B@6|6Bw4t7Sb`Kk_$=Ud@7}F{SDEFTP^{;sda;~XGAy?ADu>!Dbf*ACW z!wX+`Rz!L_RhQ$Dr(&bKC?6-TVU%WV0n>W^fe7+8%uS>3`S$!_zYDrh#5}9+x@g~XIah(snw`ra7|#Zz(~JZ zXF|5A>D_+niM>w3lSQcrmN0JaGAFkgNsu#v#1G3 zAk{J}ZZQ_MM*gCLEc})Cw9+mmA)^p=5=&5S#_Hv~*A8wO$CLthdtIfRbyPzhI;b_0f1ay%@IWYvxQI8CK>`++WL9Es@ z@uI%zn9Mn~LF74Q8!f)rp(|0j7G-K2SzUo?K|}i+&nCK_7MmE=Zd$G|TDuV)%If85 zh6iA$R2@56d9{@sU?(iIjW^GS%k)PM9e;W#Zuxb)HH9}~oXujfMoliM8A}cWX`q6yPKfJy=m<(C4Q@*VT=Y>@P9%S_3}) z^{Eox_FB=4(fHfGeFwwPm^cXz91y&aIp6znced1e2b|sE$7au9b%^fo>^FUPJj<(o zZ4-wrU{8>f^B+FGxDmNF#xM(<#NZj@(mdG5VRw#akg?=xe-MMcPy%A=z!dK|6+ChD z+~}{39ax~9h#y034ZV5+rL0gYzg(Z&Cw=t$D6QX5J5humBB>)9cU8eu_pmAapta)( z+R^*=AIG0Wy-9x+C8eHHlo`pdOt%MJd%Ffo69~l`@3uz|275~dSb$x_&kyu*L(x%K zM?mm10G&-M8*h7F(6?God8eT?e)tBzlns#(7T#cR?MC(Y_SP58Qezl!yApl$DBMow z24pSNkt^K|FqW(U>s;&MMVEH@%AKcwf8LhgFPk%v41zbrp-k#p0^KtMe;XC-Bopt zhVR9xX#$&zD&<>-F^Wh1(x1R6zT-=ABI`=1aX6EpemnO=AQ-=zPXyXC?jtW*9yx?l zy({?ZpYS|}+IaT_z&~BFiwNWJSO!g1k^(xdYd#nNl7?pE%Gd^HQ5!Ls+aUk{_HDqG zr2u=7X}!@>szPF~N(of>!Aa_fqa~c-+EuI9}PvJ*Z z%=?c}R;h&zC;TC7JzAw4>?<+Tj6#us-{2a9U#;bEPb%-;>8S9KB}64dI6hdMo?k7{ zYvOxb{$sZERLTj#xLy&cWVi{k<1b?`i?w&8_e+A?MS>c%ci?d84;EtwBCkZ;wK;fE zt&q#f+Snxb^N+utXGMqCT_f0GCbm1G{eSg2UmyKGwAwTv=bKyn6*`ZK6)RAqqhgky zeDy$3=8;1tgxYM#e1JL}9y`KIksOL{FDJJuLZ=U@Gov8?3yRf2^_#At zsPH@&m~cNz5z1~&hM#lBce&r_L4b6NTFfgifUQ3TWXmMl>A6aItFX;OO{X&7P#P2& z8L-8ox8Yv*GQfbCF#?zGM4|ps+7$xA!d_x)uR*qP1LB9r`*NA)Xf(~kd$p2*QsSr? zpe{IJf49q$#j`THY-4-eE%u?Z9devrAGCK&kb%Zg@@)%?)m;(<)K=BHDpKm4UNnL- zbJQLV(uv-|JEP@|{F%8RINqlHp;v95JBvNljZ5#R5YqQwlUN^{I^0NQ<03^1Xsy7& z`8q#5UFm$wju%l#I@8l(wB`_9Ww1#MK#5*a)C-kpbePhoSv zCK-%g+O4NmX@Temq3L4SNe(c?PB1tUT;wb()+1)S=4K^N(-wBzDH7wG{c!2VPm_OZ+R>x6IyG%glwW z$|IA;Az!Nv7^iK8f@e*X59~w>&JbZgPGr)O5TDWz`~~9Z$qzQNq`>D`$P~03A_562 zVWaac&IMWsjbKRa0QARC=bb|a^!{}86zveFgbnhKs7TW~x~e67+9UcO2xByqSb^Eo z-9Y_+WR*?oyN;pHab+78-P9Av%2LN_4XaILL05J-mKc?2LF)I*DwYa_BQvxYc~s|K zjse)kR3?}ea<4H8Q7H79=kdX`7slfGM3NY1M5to<2Mjkt zM~$Ac48Ayf3~1EU`RdP}aW{CrtsTVP|A_-B1|ZCPvG}OQ=@eGwNQA8tjOzj!GSKLK zju?EWjc4=sB3qOZViz;`|21{iaZSEq+aKLAB}U@}2>~gkLmVO@tsspc=tfD5ZiUee zq7s7O=tf{P(k)1epiI;Cu2gr4s<#Vb3a8t_vp**v*~$=a$P7SUI6Bnb)>jTA(`$ekOwh&|Nb1@ zgi_G@3=9B>UCE$7PnUVrohD7@n*kg==u6q-DWK~=-%>Vlk_jiA{6zt!z>xpjAzff| z=h^(Q*^+{Rj|;0OIwJO%^Tx9xR;APvgMRqC8ja(el{*b@!s&>sD)ray-a(SzmrYBJ zCq}%ASPee{`G*(&{lcFiJ$awL0vLIab4~FDb;H3N8z*O%vqd704*-hJwGzKvg>HIV zoTOi5nuB-BJ1D`hgR$nT3<5r(!Q~Hl_o;6PcWYSKykM1tCMsHtRIAU5(A%ywB(US% z4Y*RPfmBU&sPw>$H_jwd8&5-U)bMKuZI|K6ZJk1kiiY z>3e-74M_R8;DtNCx%J$5^0qtORtlg!8Y!+LAA3XVd+?3;wf&O=C)V-X;6elvK>a0+ z5}4KW_7a=~e`Y>;dj&kL2w)+95BaGmxuF1rBe(znOy%~3-Wnwqe0n+nCM0acm-ows zrk8DEZ9VbI4_alFLUis#F`hoO3vl=pvkk-ESs=tV(dlZOHvvbD(+N}OC2cD7Azdu7 z(8HB7`m&DN6UTvQFVoisYRX`ay%_-DvPpZteT2KoG!oN(+f!=m(G~KL1!L%Ofr1GW z+{X-jy+Sh>5b8qQCWly@kFUS1k8{!(gnQ;zc)$We6~RB-ttBpT-&g>i4m>mu7H5@n zF%rLd)F0nrrJ)zDTjbF-ChU6Sw^OGkF7bS6HoqNEI`U5hQo7RkE=S}?eYN#Cw)ey) zJn{C*JUN;mf9exlWsMlC`$Os1#q159{L$wQLi$0tZguWk!6`S5wm{}{Bj63n^eJzE zn38r5Q*x}d|5uaHM=YqZo4^=$E@ECi+Y}HviXW1FN;}5@${%uq95o~d^lU37Q^)iZe5#@N*zo=6xIS~*UM~{J!_I4U&~&eWCVS07oRcoQ;$jJq*hQ6yY6gk z2;~QU9G1XW&8QdC>$=^$ZAj^6jhuP5RVqgzBwlDYN*mZVaERh7$WiW8ANPkkXQpRO zh!}Xzsb^;pyS{A5Pp>a2($&jupIhK0Pw5%hb~d8;pBHzbpKB(rZx$Cu5_*6go*OO; z^s>&Mi(Y|A$cQ%Ku|XlI*nhrrYItE+VIN7zD3*9IX`)naQTDrWf|oBi^OA%519xQ+ z2l1S#q14`Oh74Gjin&RAW5*qbsUWKw5gCd-o?veBg=W_b62XvO;WY|<2JDzdLE(yb z5%`t(0!E)gtglx&Z+zTn=YZqOsRL5X7%a)8j-l73ymQ;c5@2Wix1YHPgn(0NPNK(Q z3J`-F$6>#Ff_(Q)ac8P=lM=L4iN~5-7EkXSTMVhVXRmrT9|h>H`=Uym4K*CA(FIY< zlT6rDT{uD{bLAm`bg!LnB_=7~0uRaioMb}(v+Xy>7Mr_BDlpP{KoSrhjabA2UF@vL z*qKLNnZtbZ`2t|zrViXFw?={e zi;_?IpHXC zyb>*zc4c&h^!(K@3=htzB%+5l%iW)o98I%NnlFe&v!|f@z1Fb&PZafwEH)4=Si9oa zf3zXN!_Q0REz2hFVroGn(vNfemJ3QxV@?pBoyq=KWA4(={_mjFJhjMhGib;UF(&9( zmmm-kLiB_#3AC+cv7igeDPGVr=ymx;cxx+sq^(5smPuskmx?D-QySx9`;KJ zOfKiYW0dKA%q{-Bp~^{TV&A^Ky**|Ca1sBSs;>r?2CQy|aA0imv8 zhPI8cb-VrNQ9gW0^qHYzJVs1KBcD+&Ywd?EX~4p6A^D2Yli;|E$(w%_Ofqnd?y*Lj z&$+Cfc759Aw{5A7umK!83paNTol33>V&ydmkKejELi?R`q~%BHrnUd8yfkP6V?4Ca z+D`gw!Qa1sXD*KrM(?xBswZ@=Cd7&2w;vZ9i-GhdLNZ**K=i+NRkom!&Iu>XtneU@ z{*WBf%a^KY00z-xo3e_txyhtpZRzngSh;!1)MQgZi}w$V#{7FC@LCCGI{%)h_xH}h zN>)GmyO(Az|63c9fq9#Vr)7E?*P2(?!@|N8X+{7XLkSPr!e3S)n$6pfHJZXO793&L zCm~B$z2YmERJTNP?T23j^XZ##2+4!r+Rv8RT<$-mV5aRc^AfLRfj*%cwtxmF&AzOS z4Mg2}cZfKT7K^IQeO#1LS~GN~mL_lfs$;qr3n#%_HMp#aKng8!7pyM8?ig1+h-lFF^jtODZC~Q`)OD8 zg2}W9W>c=`(}is_MTHInDlhewPSI`-T`BjXG*l#2-ZsG zaV#_P$7hl;AXp*iNw~2}96`=~f=uLL2A)W467$SdzfP^r^O8-{d3yb;^hk!mei)7{ z5i4nlN*{gMv;FrmQIPrHXI-%3h<`dLf0ZVStcq?Y;~Rz%t3uGWS=vWq?*OtYw+o1- zPmFrToWld@+ea$xq{C{Ax zBb%!)8KK45*ifTU($l@Su8F5;9BG7qalM>HnV}*$jFt4h%%sZ`RJ< zS;;43=WeBB|77mf!PPx5ISqvp-YXVd^|Ta#dwD||szYZezQTz7Hw&d>2X}T{+|Xzy z6mErq_{8iW`;noBKUuC|NaRlht>g8a^|gK3{8hteX>95N<|U8ghKtg{d7=i>NM-;o z%t{SPZ77DrK!R4-<$-IR{@Ty@G)yD7AKj-@2^deKfy|@#VQ3cU0IS%A|2$Rf3rOK@ z@2EcGg1ZI)j~)lUZtXIA5JGe--1;aQJ3KAD`TlaXBhVkVAuh*#LMvF#*y@}F5gSG>h zXp%mLBlga~r!YHmP2`~ya+O3yw?&0@%GWJHSu5f2`B)%Y)4Qher5JFSR%77}HX0pK zDZK0fXWvUFhYdBFX7G)tj#K3XsOGbNDmIGZYx8M56u+c|XJ}CdFEjPmD44Q)s8Cxs zBUV8a`Y+$N<)z_B0qT3tx!#V%bujWc+e(6RUS}9@)lX2O{GNxxLUeC1v@f!o3!@4Ky?@+Y=VMFghM1y=;gMtgZKeSql5{9gieTbEP z5uWjFBr8w#LvIGBb(j}$6El(o8YYm|+%1?wNlFLf% zrrDsaRe@=2x7!V{`H_WkU&*Ec(5qW9L2&XAJc6f2D`elN=w-xu)YB_2 zw#;&Uy{xURSGMi!!mJN+3VJZI_R<;C+O_@FJs$nZ;w-9At#8W@55B(>|D6bYLZ6r1 z9vZeDaLv}IWRu&eX^&g6LcJxs9-|;4QyIm9<6$;BWO~C`yIu}gel06lV+YTX=n!rE zXr8}WYKm{fU`nYw=$Rz(U~{AnrHlD}L=QhHnqVb%j3T*l1eNHptJJLwgPwwwcx(l~ zE|{#|_6|)pt=d+&nL6vL*%zPwv*E`q=I!(Ylk6ci<fASqY69vo-y4DADzMs>qPhTfmTpBSm!C{nLOpQOQ2PeS_iFAgdbCs< zhxdsU$ZH!2z%?+i=;61%iW-M)+Up45Uq}A-ntN&yJwe7v4AXJuHIV3XU`lY*V`$5) zDXPBYs0Zz?euQ;Py&GHsYRC36Y;pB$uSg&AfzocTx72*sfN0c)BVynGg2ecA+Ke*1 z!~$!mS?EFrEeRi+ep(~Z6_iT9_ew4WW&WU4@af2iHu;akZ~68Y8B^v z=2$_KeqFVvhef=*s`O@V@`3*aD7zR@bu{)$5L!QiPi!{L_UCcBUrGl2u-m6a7=9{( z77os;K|6dO8bQqwZ|(&Y8tmOswdO81#}WsXz!8BW_2T%zX!FCc~yKyyA5NdW-ht~3thZwa5_Ooi)v_4QUzAMPAs>jOGkY;0`yV(rYmdg~Gn^VOHs{coRU6*=WCIlZVpgS{vt8B zTS?U@ZCTZf$l8I+%=# zzJ)F*zbQFvn+aK>lm<0B?`ljlt18s5{wtsa-4KgO8Ue}Y z>UJS&S+Ck7;<{eTar6d6Y~Q3Po{C48f9|n3D<1lv{`ZsN=rkYpy=77egu+f8an~@@ zGkV3F&Cbq_9{r*pFoOx+fhAylf(+wfdn!yvZ^8(AaKW8l!ftj~)4?Sg>t2U!)F$~m z(ZsR1DL(GzsC+J$vrJ5o{Ug^1{k%V$Fo(z`z7)kPTQylh(RQ-&mOoOtv^-P_Xz_0^ zU-G^_&%o1q7K(8SA)%`y|0O+iWOmmHEpMTvxeRH?P^Ggls6A=dC)n@sp?W9SgJ(nR zEsIhIrlh$;E2(U#^OtkMO!=9j?Ll7WjC;!9cBx%e{S8xJRvSoWH09oZRMvGf8&YDp z?BEcs*IyvpXYn6tG_G`4cz*o^LORHe?fGii`kOxN+Wo`KL;yTie3 zR^8@x<-aMYK`NQYfPOz*J9dM;H~VVmPr?bkz+L(6FB1?4Gz0OY(*(FHDRff}!Ci-` znb?8qsDbX7xn2xQgk#GUBj0cSZ_W2U51am;3dv=+R*w)S;4@ zXpw#PvvUgw9D?x$!RnR!UtRy}?RnA#b9uE%mNE)vM|1MSzJgE^_^vOszOooAJw3zf zAUx3MjQfYA8u#OG1s?cI$NPG?0pv2t<=qw9ty9 zcI4Nog79^VS-}~-jcWsDVA*Xem(Gfd>NEMMR59&PI${#{qGa>~v;Z>XGDHL-L@CQ6N`L(%s|7b_%}16%U(W}mfxg&QWbfZi=DLXfR&hgD5qiN%#9-tfk-}_(t7sz zVadm<3s-SgVhUckfZ-Q+?Svkl<-}E!Af5Qk_&d;y?vsbK6zrbgU*7vXA8-o1@MU5! zE=*vs^S}I4nI1|g>GmD3H!KpY$0V=EKr?oqg=$0P-rkQFx&o zx`tyA*_YxBg(H3kVB; z+AL_Vt!{Z-X&_ zLfhf;$tz#s+mwQQ{FR>c>QkVFeyt~+w?C^Ag02f>uIT~4 zuDl63R@79YYr!2^KYJ`UurCM>u&j9u4#0_(&StCjZzE{PgK0(HLXjf#mC8v<+zOci z`12`TI~OV(R;{qEw;3i#6KHIhA^OIA!NeQ^UM$~i6-52e-N!HKc_BEsxXQdU$x`Wx z4fr(jTLiu;dJbQS52CT5(3yjAHmdr6rzBz&?;{!Y7`wOv8QglVvK%`mkf5q|=>;W* z`9aO~0a+tEQB<_MMW1}r?NGhdr|aqCiOiJ}g8KWTGw#HO&nXtBvB?c;E$ueUC3QIG z?IZ}?>}H-e@8z`Rm4W@waRFVi^A-{Zj-3xz5`KeVk7kz_TV25^%CYu`Ljaxs_FPi@ zU#W^XP#c3u6d8{?VarZvHWeEOhXUaM`)dt1DVmSO#RQZ`S0rJSx%`9~&(#WSvS%KC zlSt9es^ay3pPn_ZSFp7loDjr&k7$Yh!3`0s<-qm)zW@;nVZ32NSNl33HXZ-|-Q0Mm zLe-bcd4_6sNA+MsYC3M2V3ie{ie=K`WN{v0=lXgj=`%_@{7N}PiqRtMNx;XN0MN0} z$w1)L&50Oa0~2O2aH#mvgRyC=@y=YDb@mOIefWA#!nc&Tl^}tqw_kNpCN-ZT@FLI6`$68nJ$(0Y+?7l^t$ar34-XiGl^$?0hr08=S4}F@HaAQ3w zm>ib?wobsm3K%C?*hDy1W!;6GGQv-gnX5&!8Xe4jfGWCW+5G(-m~1BUi~@H>i>hg@ z7I0?SlZdr(zMO1k@3l6%vdHT~!OSdLa#y2nzR8i(_o_@aqg|1@w&r55% z#NkbRhrTE5TNU52=Y(of$4?F9gyGy|KT3h8)aJY-G_P8gWb6P?w)byl*tOaFHaNx+ zYUl{Rq`UP3Z~!8Iw#;Q?+?35_{p&xP{t9aNi1Yj-IYi*`XKyLdDS~J%aqCCkm^9gV n-dLJu11~LBv%xn_`}aRC6uzxeYt2*#0)Et0wGpK%Rw4ffMai-q literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 47dafed48..220a62ac0 100644 --- a/package.json +++ b/package.json @@ -167,10 +167,12 @@ "keycloak-js": "^21.0.0", "localforage": "^1.10.0", "lodash": "^4.17.21", + "oidc-client-ts": "^2.4.0", "pf-4-styles": "npm:@patternfly/patternfly@^4.224.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-intl": "^6.2.10", + "react-oidc-context": "^2.3.1", "react-redux": "^8.0.5", "react-router-dom": "^6.8.2", "redux": "^4.2.1", diff --git a/src/auth/ITLessConnector/.eslintrc.js b/src/auth/ITLessConnector/.eslintrc.js new file mode 100644 index 000000000..c3774b600 --- /dev/null +++ b/src/auth/ITLessConnector/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + rules: { + 'no-restricted-imports': 'off', + }, +}; diff --git a/src/auth/ITLessConnector/ITLessProvider.tsx b/src/auth/ITLessConnector/ITLessProvider.tsx new file mode 100644 index 000000000..86757d263 --- /dev/null +++ b/src/auth/ITLessConnector/ITLessProvider.tsx @@ -0,0 +1,106 @@ +import React, { useEffect, useState } from 'react'; +import { cogLogout, createUser, getEntitlements, getTokenWithAuthorizationCode, getUser, login, mapCogUserToChromeUser } from './auth'; +import ChromeAuthContext, { ChromeAuthContextValue } from '../ChromeAuthContext'; +import { initializeVisibilityFunctions } from '../../utils/VisibilitySingleton'; +import createGetUserPermissions from '../createGetUserPermissions'; +import { loadModulesSchema } from '../../redux/actions'; +import { useDispatch, useStore } from 'react-redux'; +import initializeAccessRequestCookies from '../initializeAccessRequestCookies'; +import { init } from '../../utils/iqeEnablement'; +import logger from '../logger'; +import AppPlaceholder from '../../components/AppPlaceholder'; +import { loadFedModules } from '../../utils/common'; + +const authChannel = new BroadcastChannel('auth'); +const log = logger('ITLessProvider.tsx'); + +const ITLessProvider: React.FC = ({ children }) => { + const [cookieElement, setCookieElement] = useState(null); + const [state, setState] = useState({ + ready: false, + logout: () => { + cogLogout(); + }, + login: async () => { + login('your_username', 'your_password'); + }, + logoutAllTabs: () => { + authChannel.postMessage({ type: 'logout' }); + cogLogout(); + }, + loginAllTabs: () => { + authChannel.postMessage({ type: 'login' }); + }, + getUser: createUser, + getToken: getTokenWithAuthorizationCode, + user: { + entitlements: {}, + identity: { + type: '', + org_id: '', + }, + }, + token: '', + tokenExpires: 0, + doOffline: () => Promise.resolve(), + getOfflineToken: getTokenWithAuthorizationCode, + }); + + const store = useStore(); + const dispatch = useDispatch(); + + async function setupSSO() { + const { data: microFrontendConfig } = await loadFedModules(); + dispatch(loadModulesSchema(microFrontendConfig)); + initializeAccessRequestCookies(); + + const user = await getUser(); + const entitlementRes = await getEntitlements(); + const token = await getTokenWithAuthorizationCode(); + const chromeUser = mapCogUserToChromeUser(user, entitlementRes); + init(store, token); + initializeVisibilityFunctions({ + getUser: createUser, + getToken: getTokenWithAuthorizationCode, + getUserPermissions: createGetUserPermissions(createUser, getTokenWithAuthorizationCode), + }); + authChannel.onmessage = (e) => { + if (e && e.data && e.data.type) { + log(`BroadcastChannel, Received event : ${e.data.type}`); + + // TODO: handle scopes + switch (e.data.type) { + case 'logout': + return cogLogout(); + case 'login': + return () => undefined; + case 'refresh': { + getTokenWithAuthorizationCode().then((token) => { + setState((prev) => ({ + ...prev, + token, + })); + }); + } + } + } + }; + setState((prev) => ({ + ...prev, + user: chromeUser, + ready: true, + token, + tokenExpires: user?.exp, + })); + } + useEffect(() => { + setupSSO(); + }, []); + + if (state.ready) { + return ; + } + return {children}; +}; + +export default ITLessProvider; diff --git a/src/cognito/auth.ts b/src/auth/ITLessConnector/auth.ts similarity index 83% rename from src/cognito/auth.ts rename to src/auth/ITLessConnector/auth.ts index 2e3bbef17..9357afa4e 100644 --- a/src/cognito/auth.ts +++ b/src/auth/ITLessConnector/auth.ts @@ -1,6 +1,7 @@ -import { AuthenticationDetails, CognitoUser, CognitoUserPool } from 'amazon-cognito-identity-js'; -import { getEnv } from '../utils/common'; -import { isBeta } from '../utils/common'; +import { AuthenticationDetails, CognitoUser, CognitoUserPool, CognitoUserSession } from 'amazon-cognito-identity-js'; +import { getEnv } from '../../utils/common'; +import { isBeta } from '../../utils/common'; +import { ChromeUser } from '@redhat-cloud-services/types'; export interface CogUser { auth_time: number; @@ -24,6 +25,7 @@ export interface CogUser { token_use: string; username: string; version: number; + is_active?: boolean; } async function fetchData() { @@ -104,7 +106,7 @@ export async function getTokenWithAuthorizationCode() { } } -export async function getUser(): Promise { +export async function getUser(): Promise { const token = localStorage.getItem('ACCESS_TOKEN'); const requestOptions = { @@ -148,38 +150,41 @@ export async function getEntitlements() { } } -export async function createUser() { - const userRes = await getUser(); - const entitlementRes = await getEntitlements(); - - const user = { - entitlements: entitlementRes, +export function mapCogUserToChromeUser(cogUser: CogUser, entitlements: ChromeUser['entitlements']): ChromeUser { + return { identity: { - account_number: '1234', - org_id: userRes.org_id, + account_number: cogUser.org_id, + org_id: cogUser.org_id, type: 'User', user: { - username: userRes.username, - email: userRes.email, - first_name: userRes.first_name, - last_name: userRes.last_name, - is_active: userRes?.is_active || true, - is_org_admin: userRes.is_org_admin, - is_internal: userRes.is_internal, - locale: userRes.locale, + username: cogUser.username, + email: cogUser.email, + first_name: cogUser.first_name, + last_name: cogUser.last_name, + is_active: cogUser?.is_active || true, + is_org_admin: cogUser.is_org_admin, + is_internal: cogUser.is_internal, + locale: cogUser.locale, }, internal: { - org_id: userRes.org_id, - account_id: userRes.id, + org_id: cogUser.org_id, + account_id: cogUser.id, }, }, + entitlements, }; - return user; +} + +export async function createUser() { + const userRes = await getUser(); + const entitlementRes = await getEntitlements(); + + return mapCogUserToChromeUser(userRes, entitlementRes); } export async function login(username: string, password: string) { const data = await fetchData(); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { const authenticationData = { Username: username, Password: password, diff --git a/src/auth/OIDCConnector/.eslintrc.js b/src/auth/OIDCConnector/.eslintrc.js new file mode 100644 index 000000000..c3774b600 --- /dev/null +++ b/src/auth/OIDCConnector/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + rules: { + 'no-restricted-imports': 'off', + }, +}; diff --git a/src/auth/OIDCConnector/OIDCProvider.tsx b/src/auth/OIDCConnector/OIDCProvider.tsx new file mode 100644 index 000000000..7b357afa3 --- /dev/null +++ b/src/auth/OIDCConnector/OIDCProvider.tsx @@ -0,0 +1,81 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { DEFAULT_SSO_ROUTES, loadFedModules } from '../../utils/common'; +import { AuthProvider, AuthProviderProps } from 'react-oidc-context'; +import { WebStorageStateStore } from 'oidc-client-ts'; +import platformUrl from '../platformUrl'; +import { OIDCSecured } from './OIDCSecured'; +import AppPlaceholder from '../../components/AppPlaceholder'; +import { postbackUrlSetup } from '../offline'; + +const OIDCProvider: React.FC = ({ children }) => { + const [cookieElement, setCookieElement] = useState(null); + const [state, setState] = useState< + | { + ssoUrl: string; + microFrontendConfig: Record; + } + | undefined + >(undefined); + async function setupSSO() { + const { data } = await loadFedModules(); + try { + const { + chrome: { + config: { ssoUrl }, + }, + } = data; + // add trailing slash if missing + const sanitizedSSOUrl = `${ssoUrl.replace(/\/$/, '')}/`; + setState({ ssoUrl: platformUrl(DEFAULT_SSO_ROUTES, sanitizedSSOUrl), microFrontendConfig: data }); + } catch (error) { + setState({ ssoUrl: platformUrl(DEFAULT_SSO_ROUTES), microFrontendConfig: data }); + } + } + useEffect(() => { + // required for offline token generation + postbackUrlSetup(); + setupSSO(); + }, []); + + const authProviderProps: AuthProviderProps = useMemo( + () => ({ + client_id: 'cloud-services', + silent_redirect_uri: `https://${window.location.host}/beta/apps/chrome/silent-check-sso.html`, + automaticSilentRenew: true, + redirect_uri: `${window.location.origin}`, + authority: `${state?.ssoUrl}`, + metadataUrl: '/realms/redhat-external/protocol/openid-connect/auth', + monitorSession: true, + metadata: { + authorization_endpoint: `${state?.ssoUrl}realms/redhat-external/protocol/openid-connect/auth`, + token_endpoint: `${state?.ssoUrl}realms/redhat-external/protocol/openid-connect/token`, + end_session_endpoint: `${state?.ssoUrl}realms/redhat-external/protocol/openid-connect/logout`, + check_session_iframe: `https://${window.location.host}/beta/apps/chrome/silent-check-sso.html`, + revocation_endpoint: `${state?.ssoUrl}realms/redhat-external/protocol/openid-connect/revoke`, + }, + // removes code_challenge query param from the url + disablePKCE: true, + response_type: 'code', + response_mode: 'fragment', + onSigninCallback: () => { + window.history.replaceState({}, document.title, window.location.pathname); + }, + userStore: new WebStorageStateStore({ store: window.localStorage }), + }), + [state?.ssoUrl] + ); + + if (!state?.ssoUrl || !state?.microFrontendConfig) { + return ; + } + + return ( + + + {children} + + + ); +}; + +export default OIDCProvider; diff --git a/src/auth/OIDCConnector/OIDCSecured.tsx b/src/auth/OIDCConnector/OIDCSecured.tsx new file mode 100644 index 000000000..47a6adf4a --- /dev/null +++ b/src/auth/OIDCConnector/OIDCSecured.tsx @@ -0,0 +1,175 @@ +import React, { useEffect, useState } from 'react'; +import { hasAuthParams, useAuth } from 'react-oidc-context'; +import { User } from 'oidc-client-ts'; +import { BroadcastChannel } from 'broadcast-channel'; +import { useDispatch, useStore } from 'react-redux'; +import { ChromeUser } from '@redhat-cloud-services/types'; +import ChromeAuthContext, { ChromeAuthContextValue } from '../ChromeAuthContext'; +import { generateRoutesList } from '../../utils/common'; +import { loadModulesSchema } from '../../redux/actions'; +import getInitialScope from '../getInitialScope'; +import { init } from '../../utils/iqeEnablement'; +import entitlementsApi from '../entitlementsApi'; +import { initializeVisibilityFunctions } from '../../utils/VisibilitySingleton'; +import sentry from '../../utils/sentry'; +import AppPlaceholder from '../../components/AppPlaceholder'; +import { FooterProps } from '../../components/Footer/Footer'; +import logger from '../logger'; +import { login, logout } from './utils'; +import createGetUserPermissions from '../createGetUserPermissions'; +import initializeAccessRequestCookies from '../initializeAccessRequestCookies'; +import { getOfflineToken, prepareOfflineRedirect } from '../offline'; + +type Entitlement = { is_entitled: boolean; is_trial: boolean }; +const serviceAPI = entitlementsApi(); +const authChannel = new BroadcastChannel('auth'); +const log = logger('OIDCSecured.tsx'); + +/* eslint-disable @typescript-eslint/no-explicit-any */ +function mapOIDCUserToChromeUser(user: User | Record, entitlements: { [entitlement: string]: Entitlement }): ChromeUser { + return { + entitlements, + identity: { + org_id: user.profile?.org_id as any, + type: user.profile?.type as any, + account_number: user.profile?.account_number as any, + internal: { + org_id: user.profile?.org_id as any, + account_id: user.profile?.account_id as any, + }, + user: { + email: user.profile?.email as any, + first_name: user.profile?.first_name as any, + last_name: user.profile?.last_name as any, + is_active: user.profile?.is_active as any, + is_org_admin: user.profile?.is_org_admin as any, + is_internal: user.profile?.is_internal as any, + locale: user.profile?.locale as any, + username: user.profile?.username as any, + }, + }, + }; +} +/* eslint-enable @typescript-eslint/no-explicit-any */ + +async function fetchEntitlements(user: User) { + let entitlements: { [entitlement: string]: Entitlement } = {}; + try { + if (user.profile.org_id) { + entitlements = (await serviceAPI.servicesGet()) as unknown as typeof entitlements; + return entitlements; + } else { + console.log('Cannot call entitlements API, no account number'); + return entitlements; + } + } catch { + // let's swallow error from services API + return entitlements; + } +} + +export function OIDCSecured({ + children, + microFrontendConfig, + cookieElement, + setCookieElement, +}: React.PropsWithChildren<{ microFrontendConfig: Record } & FooterProps>) { + const auth = useAuth(); + const store = useStore(); + const dispatch = useDispatch(); + const [state, setState] = useState({ + ready: false, + logoutAllTabs: (bounce) => { + authChannel.postMessage({ type: 'logout' }); + logout(auth, bounce); + }, + logout: () => { + logout(auth, true); + }, + login: (requiredScopes) => login(auth, requiredScopes), + loginAllTabs: () => { + authChannel.postMessage({ type: 'login' }); + }, + getToken: () => Promise.resolve(auth.user?.access_token ?? ''), + getOfflineToken: () => + getOfflineToken( + auth.settings.metadata?.token_endpoint ?? '', + auth.settings.client_id, + encodeURIComponent((auth.settings.metadata?.token_endpoint ?? '').split('#')[0]) + ), + doOffline: () => login(auth, ['offline_access'], prepareOfflineRedirect()), + getUser: () => Promise.resolve(mapOIDCUserToChromeUser(auth.user ?? {}, {})), + token: auth.user?.access_token ?? '', + tokenExpires: auth.user?.expires_at ?? 0, + user: mapOIDCUserToChromeUser(auth.user ?? {}, {}), + }); + + const startChrome = async () => { + const routes = generateRoutesList(microFrontendConfig); + dispatch(loadModulesSchema(microFrontendConfig)); + + const initialModuleScope = getInitialScope(routes, window.location.pathname); + + const initialModuleConfig = initialModuleScope && microFrontendConfig[initialModuleScope]?.config; + initializeAccessRequestCookies(); + + if (!hasAuthParams() && !auth.activeNavigator && !auth.isLoading && !auth.isAuthenticated) { + login(auth, initialModuleConfig?.ssoScopes); + } + }; + + async function onUserAuthenticated(user: User) { + // order of calls is important + // init the IQE enablement first to add the necessary auth headers to the requests + init(store, user.access_token); + const entitlements = await fetchEntitlements(user); + const chromeUser = mapOIDCUserToChromeUser(user, entitlements); + const getUser = () => Promise.resolve(chromeUser); + initializeVisibilityFunctions({ + getUser, + getToken: () => Promise.resolve(user.access_token), + getUserPermissions: createGetUserPermissions(getUser, () => Promise.resolve(user.access_token)), + }); + setState((prev) => ({ + ...prev, + ready: true, + getUser, + user: chromeUser, + token: user.access_token, + tokenExpires: user.expires_at!, + })); + sentry(chromeUser); + } + + useEffect(() => { + const user = auth.user; + if (auth.isAuthenticated && user) { + onUserAuthenticated(user); + authChannel.onmessage = (e) => { + if (e && e.data && e.data.type) { + log(`BroadcastChannel, Received event : ${e.data.type}`); + + // TODO: handle scopes + switch (e.data.type) { + case 'logout': + return state.logout(); + case 'login': + return state.login(); + case 'refresh': + return auth.signinSilent(); + } + } + }; + } + }, [JSON.stringify(auth.user), auth.isAuthenticated]); + + useEffect(() => { + startChrome(); + }, [auth]); + + if (!auth.isAuthenticated || !state.ready) { + return ; + } + + return {children}; +} diff --git a/src/auth/OIDCConnector/createUUID.ts b/src/auth/OIDCConnector/createUUID.ts new file mode 100644 index 000000000..48c18010e --- /dev/null +++ b/src/auth/OIDCConnector/createUUID.ts @@ -0,0 +1,44 @@ +// UUID generator required to create a nonce attribute for SSO login +// More efficient than installing the uuid package as we need just a small fragment of the package +// Same as the keycloack-js implementation + +function generateRandomData(len: number) { + // use web crypto APIs if possible + let array = null; + const crypto = window.crypto; + if (crypto && crypto.getRandomValues && window.Uint8Array) { + array = new Uint8Array(len); + crypto.getRandomValues(array); + return array; + } + + // fallback to Math random + array = new Array(len); + for (let j = 0; j < array.length; j++) { + array[j] = Math.floor(256 * Math.random()); + } + return array; +} + +function generateRandomString(len: number, alphabet: string) { + const randomData = generateRandomData(len); + const chars = new Array(len); + for (let i = 0; i < len; i++) { + chars[i] = alphabet.charCodeAt(randomData[i] % alphabet.length); + } + return String.fromCharCode.apply(null, chars); +} + +function createUUID() { + const hexDigits = '0123456789abcdef'; + const s: (string | number | boolean)[] = generateRandomString(36, hexDigits).split(''); + s[14] = '4'; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); + s[8] = s[13] = s[18] = s[23] = '-'; + const uuid = s.join(''); + return uuid; +} + +export default createUUID; diff --git a/src/auth/OIDCConnector/utils.ts b/src/auth/OIDCConnector/utils.ts new file mode 100644 index 000000000..dd90bf751 --- /dev/null +++ b/src/auth/OIDCConnector/utils.ts @@ -0,0 +1,81 @@ +import { AuthContextProps } from 'react-oidc-context'; +import { LOGIN_SCOPES_STORAGE_KEY, deleteLocalStorageItems, getRouterBasename, isBeta } from '../../utils/common'; +import { GLOBAL_FILTER_KEY, OFFLINE_REDIRECT_STORAGE_KEY } from '../../utils/consts'; +import Cookies from 'js-cookie'; +import logger from '../logger'; +import createUUID from './createUUID'; + +const log = logger('auth:utils'); + +enum AllowedPartnerScopes { + aws = 'aws', + azure = 'azure', + gcp = 'gcp', +} + +function isPartnerScope(scope: string): scope is AllowedPartnerScopes { + return Object.values(AllowedPartnerScopes).includes(scope as AllowedPartnerScopes); +} + +function getPartnerScope(pathname: string) { + // replace beta and leading "/" + const sanitizedPathname = pathname.replace(/^(\/beta\/|\/preview\/)/, '/').replace(/^\//, ''); + // check if the pathname is connect/:partner + if (sanitizedPathname.match(/^connect\/.+/)) { + // return :partner param + const fragmentScope = sanitizedPathname.split('/')[1]; + if (isPartnerScope(fragmentScope)) { + return `api.partner_link.${fragmentScope}`; + } + log(`Invalid stratosphere scope: ${fragmentScope}`); + return undefined; + } + + return undefined; +} + +export async function logout(auth: AuthContextProps, bounce?: boolean) { + const keys = Object.keys(localStorage).filter( + (key) => + key.endsWith('/api/entitlements/v1/services') || + key.endsWith('/chrome') || + key.endsWith('/chrome-store') || + key.startsWith('kc-callback') || + key.startsWith(GLOBAL_FILTER_KEY) + ); + deleteLocalStorageItems([...keys, OFFLINE_REDIRECT_STORAGE_KEY, LOGIN_SCOPES_STORAGE_KEY]); + const pathname = isBeta() ? getRouterBasename() : ''; + if (bounce) { + const eightSeconds = new Date(new Date().getTime() + 8 * 1000); + Cookies.set('cs_loggedOut', 'true', { + expires: eightSeconds, + }); + await auth.signoutRedirect({ + redirectTarget: 'top', + post_logout_redirect_uri: `${window.location.origin}${pathname}`, + id_token_hint: undefined, + }); + } else { + await auth.revokeTokens(['access_token', 'refresh_token']); + } +} + +export function login(auth: AuthContextProps, requiredScopes: string[] = [], redirectUri = location.href) { + log('Logging in'); + // Redirect to login + Cookies.set('cs_loggedOut', 'false'); + // TODO: Remove once ephemeral environment supports full and thin profile + let scope = ['openid', ...requiredScopes]; + const partner = getPartnerScope(window.location.pathname); + if (partner) { + scope.push(partner); + } + scope = Array.from(new Set(scope)); + localStorage.setItem(LOGIN_SCOPES_STORAGE_KEY, JSON.stringify(scope)); + // KC scopes are delimited by a space character, hence the join(' ') + return auth.signinRedirect({ + redirect_uri: redirectUri, + scope: scope.join(' '), + nonce: createUUID(), + }); +} diff --git a/src/cognito/index.ts b/src/cognito/index.ts deleted file mode 100644 index ff2280c24..000000000 --- a/src/cognito/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { cogLogout, createUser, getTokenWithAuthorizationCode, login } from './auth'; -import qe from '../utils/iqeEnablement'; -import { Store } from 'redux'; - -export const createCognitoAuthObject = (store: Store) => ({ - getToken: () => getTokenWithAuthorizationCode(), - getUser: () => createUser(), - logout: () => cogLogout(), - login: () => login('your_username', 'your_password'), - qe: { - ...qe, - init: () => qe.init(store), - }, -}); From 4ba6bbff5b9923fbda7c4d75653241508f1dfab2 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Wed, 22 Nov 2023 11:15:45 +0100 Subject: [PATCH 06/23] Generalize JWT auth methods. --- src/auth/ChromeAuthContext.ts | 48 +++++++++ src/auth/createGetUserPermissions.ts | 10 ++ src/auth/crossAccountBouncer.ts | 13 +++ src/auth/entitlementsApi.ts | 22 ++++ src/auth/fetchPermissions.ts | 6 +- src/auth/getInitialScope.ts | 17 +++ src/auth/index.ts | 98 ----------------- src/auth/initializeAccessRequestCookies.ts | 21 ++++ src/auth/logger.ts | 11 ++ src/auth/offline.ts | 120 +++++++++++++++++++++ src/auth/platformUrl.ts | 27 +++++ src/auth/setCookie.ts | 32 ++++++ 12 files changed, 324 insertions(+), 101 deletions(-) create mode 100644 src/auth/ChromeAuthContext.ts create mode 100644 src/auth/createGetUserPermissions.ts create mode 100644 src/auth/crossAccountBouncer.ts create mode 100644 src/auth/entitlementsApi.ts create mode 100644 src/auth/getInitialScope.ts delete mode 100644 src/auth/index.ts create mode 100644 src/auth/initializeAccessRequestCookies.ts create mode 100644 src/auth/logger.ts create mode 100644 src/auth/offline.ts create mode 100644 src/auth/platformUrl.ts create mode 100644 src/auth/setCookie.ts diff --git a/src/auth/ChromeAuthContext.ts b/src/auth/ChromeAuthContext.ts new file mode 100644 index 000000000..05d967f3d --- /dev/null +++ b/src/auth/ChromeAuthContext.ts @@ -0,0 +1,48 @@ +import { ChromeUser } from '@redhat-cloud-services/types'; +import { AxiosResponse } from 'axios'; +import { createContext } from 'react'; +import { OfflineTokenResponse } from './offline'; + +export type ChromeAuthContextValue = { + ready: boolean; + user: ChromeUser; + getUser: () => Promise; + token: string; + logoutAllTabs: (bounce?: boolean) => void; + loginAllTabs: () => void; + logout: () => void; + login: (requiredScopes?: string[]) => Promise; + tokenExpires: number; + getToken: () => Promise; + postbackUrl?: string; + getOfflineToken: () => Promise>; + doOffline: () => Promise; +}; + +const blankUser: ChromeUser = { + entitlements: {}, + identity: { + org_id: '', + type: '', + }, +}; + +const ChromeAuthContext = createContext({ + ready: false, + logoutAllTabs: () => undefined, + loginAllTabs: () => undefined, + logout: () => undefined, + login: () => Promise.resolve(), + getToken: () => Promise.resolve(''), + getOfflineToken: () => + Promise.resolve({ + data: {}, + } as AxiosResponse), + doOffline: () => Promise.resolve(), + getUser: () => Promise.resolve(blankUser), + token: '', + tokenExpires: 0, + user: blankUser, +}); + +export default ChromeAuthContext; diff --git a/src/auth/createGetUserPermissions.ts b/src/auth/createGetUserPermissions.ts new file mode 100644 index 000000000..be8e08c9d --- /dev/null +++ b/src/auth/createGetUserPermissions.ts @@ -0,0 +1,10 @@ +import { ChromeUser } from '@redhat-cloud-services/types'; +import { createFetchPermissionsWatcher } from './fetchPermissions'; + +export default function createGetUserPermissions(getUser: () => Promise, getToken: () => Promise) { + const fetchPermissions = createFetchPermissionsWatcher(getUser); + return async (app = '', bypassCache?: boolean) => { + const token = await getToken(); + return fetchPermissions(token || '', app, bypassCache); + }; +} diff --git a/src/auth/crossAccountBouncer.ts b/src/auth/crossAccountBouncer.ts new file mode 100644 index 000000000..6978f5b98 --- /dev/null +++ b/src/auth/crossAccountBouncer.ts @@ -0,0 +1,13 @@ +import Cookies from 'js-cookie'; +import { ACCOUNT_REQUEST_TIMEOUT, ACTIVE_REMOTE_REQUEST, CROSS_ACCESS_ACCOUNT_NUMBER, CROSS_ACCESS_ORG_ID } from '../utils/consts'; + +export default function crossAccountBouncer() { + const requestCookie = Cookies.get(CROSS_ACCESS_ACCOUNT_NUMBER); + if (requestCookie) { + localStorage.setItem(ACCOUNT_REQUEST_TIMEOUT, requestCookie); + localStorage.removeItem(ACTIVE_REMOTE_REQUEST); + } + Cookies.remove(CROSS_ACCESS_ACCOUNT_NUMBER); + Cookies.remove(CROSS_ACCESS_ORG_ID); + window.location.reload(); +} diff --git a/src/auth/entitlementsApi.ts b/src/auth/entitlementsApi.ts new file mode 100644 index 000000000..8651df518 --- /dev/null +++ b/src/auth/entitlementsApi.ts @@ -0,0 +1,22 @@ +import axios from 'axios'; +import { ServicesApi } from '@redhat-cloud-services/entitlements-client'; +import { setupCache } from 'axios-cache-interceptor'; +import { deleteLocalStorageItems, lastActive } from '../utils/common'; + +const BASE_PATH = '/api/entitlements/v1'; + +export default () => { + const instance = axios.create(); + setupCache(instance, {}); + instance.interceptors.response.use((response) => { + if (response && response.request && response.request.fromCache !== true) { + const last = lastActive('/api/entitlements/v1/services', 'fallback'); + const keys = Object.keys(localStorage).filter((key) => key.endsWith('/api/entitlements/v1/services') && key !== last); + + deleteLocalStorageItems(keys); + } + + return response.data || response; + }); + return new ServicesApi(undefined, BASE_PATH, instance); +}; diff --git a/src/auth/fetchPermissions.ts b/src/auth/fetchPermissions.ts index a09950caf..03aa73b71 100644 --- a/src/auth/fetchPermissions.ts +++ b/src/auth/fetchPermissions.ts @@ -1,6 +1,6 @@ import { Access, AccessPagination } from '@redhat-cloud-services/rbac-client'; import createRbacAPI from './rbac'; -import logger from '../jwt/logger'; +import logger from './logger'; import { ChromeUser } from '@redhat-cloud-services/types'; const log = logger('fetchPermissions.ts'); @@ -17,9 +17,9 @@ const fetchPermissions = (userToken: string, app = '') => { * We should come up with a nice pattern to work around the interceptors * */ const { data, meta } = resp as unknown as Required; - if (meta.count! > perPage) { + if (meta.count && meta.count > perPage) { return Promise.all( - [...new Array(Math.ceil(meta.count! / perPage))].map((_empty, key) => + [...new Array(Math.ceil(meta.count / perPage))].map((_empty, key) => rbacApi .getPrincipalAccess(app, undefined, undefined, perPage, (key + 1) * perPage) .then(({ data }) => data as unknown as AccessPagination['data']) diff --git a/src/auth/getInitialScope.ts b/src/auth/getInitialScope.ts new file mode 100644 index 000000000..e09ce42c6 --- /dev/null +++ b/src/auth/getInitialScope.ts @@ -0,0 +1,17 @@ +import { matchRoutes } from 'react-router-dom'; +import { RouteDefinition } from '../@types/types'; + +function getInitialScope(routes: RouteDefinition[], pathname: string) { + const initialModuleScope = matchRoutes( + routes.map(({ path, ...rest }) => ({ + ...rest, + path: `${path}/*`, + })), + // modules config does not include the preview fragment + pathname.replace(/^\/(preview|beta)/, '') + )?.[0]?.route?.scope; + + return initialModuleScope; +} + +export default getInitialScope; diff --git a/src/auth/index.ts b/src/auth/index.ts deleted file mode 100644 index 28ede508a..000000000 --- a/src/auth/index.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { getOfflineToken, wipePostbackParamsThatAreNotForUs } from '../jwt/offline'; -import { AxiosResponse } from 'axios'; -import cookie from 'js-cookie'; -import { ChromeUser } from '@redhat-cloud-services/types'; -import { Store } from 'redux'; - -import * as jwt from '../jwt/jwt'; -import consts, { defaultAuthOptions as defaultOptions } from '../utils/consts'; -import { ACCOUNT_REQUEST_TIMEOUT, ACTIVE_REMOTE_REQUEST, CROSS_ACCESS_ACCOUNT_NUMBER, CROSS_ACCESS_ORG_ID } from '../utils/consts'; -import qe from '../utils/iqeEnablement'; -import { ChromeModule } from '../@types/types'; -import { createFetchPermissionsWatcher } from './fetchPermissions'; - -export type LibJWT = { - getOfflineToken: () => Promise>; - jwt: typeof jwt; - initPromise: Promise; -}; - -const TIMER_STR = '[JWT][jwt.js] Auth time'; -function bouncer() { - if (!jwt.isAuthenticated()) { - cookie.remove(defaultOptions.cookieName); - jwt.login(); - } - - console.timeEnd(TIMER_STR); // eslint-disable-line no-console -} - -export function crossAccountBouncer() { - const requestCookie = cookie.get(CROSS_ACCESS_ACCOUNT_NUMBER); - if (requestCookie) { - localStorage.setItem(ACCOUNT_REQUEST_TIMEOUT, requestCookie); - localStorage.removeItem(ACTIVE_REMOTE_REQUEST); - } - cookie.remove(CROSS_ACCESS_ACCOUNT_NUMBER); - cookie.remove(CROSS_ACCESS_ORG_ID); - window.location.reload(); -} - -export type ChromeGlobalConfig = { chrome?: ChromeModule }; - -export const createAuthObject = (libjwt: LibJWT, getUser: () => Promise, store: Store, globalConfig?: ChromeGlobalConfig) => ({ - getOfflineToken: () => libjwt.getOfflineToken(), - doOffline: () => - libjwt.jwt.doOffline(consts.noAuthParam, consts.offlineToken, globalConfig?.chrome?.ssoUrl || globalConfig?.chrome?.config?.ssoUrl), - getToken: () => libjwt.initPromise.then(() => libjwt.jwt.getUserInfo().then(() => libjwt.jwt.getEncodedToken())), - getRefreshToken: () => libjwt.jwt.getRefreshToken(), - getUser, - qe: { - ...qe, - init: () => qe.init(store, () => libjwt), - }, - logout: (bounce?: boolean) => libjwt.jwt.logoutAllTabs(bounce), - login: () => libjwt.jwt.login(), -}); - -export const createGetUser = (libjwt: LibJWT): (() => Promise) => { - return () => - libjwt.initPromise.then(libjwt.jwt.getUserInfo).catch(() => { - libjwt.jwt.logoutAllTabs(); - }); -}; - -export const createGetUserPermissions = (libJwt: LibJWT, getUser: () => Promise) => { - const fetchPermissions = createFetchPermissionsWatcher(getUser); - return async (app = '', bypassCache?: boolean) => { - await getUser(); - return fetchPermissions(libJwt.jwt.getEncodedToken() || '', app, bypassCache); - }; -}; - -export default ({ ssoUrl, ssoScopes }: { ssoUrl?: string; ssoScopes: string[] }): LibJWT => { - console.time(TIMER_STR); // eslint-disable-line no-console - const options = { - ...defaultOptions, - scope: ssoScopes.join(' '), - }; - - wipePostbackParamsThatAreNotForUs(); - const token = cookie.get(options.cookieName); - - // If we find an existing token, use it - // so that we dont auth even when a valid token is present - // otherwise its quick, but we bounce around and get a new token - // on every page load - if (token && token.length > 10) { - options.token = token; - } - - const promise = jwt.init(options, ssoUrl).then(bouncer); - - return { - getOfflineToken: () => getOfflineToken(options.realm, options.clientId, ssoUrl), - jwt: jwt, - initPromise: promise, - }; -}; diff --git a/src/auth/initializeAccessRequestCookies.ts b/src/auth/initializeAccessRequestCookies.ts new file mode 100644 index 000000000..6bd614c09 --- /dev/null +++ b/src/auth/initializeAccessRequestCookies.ts @@ -0,0 +1,21 @@ +import Cookies from 'js-cookie'; +import { ACTIVE_REMOTE_REQUEST, CROSS_ACCESS_ACCOUNT_NUMBER } from '../utils/consts'; +import crossAccountBouncer from './crossAccountBouncer'; + +export default function initializeAccessRequestCookies() { + const initialAccount = localStorage.getItem(ACTIVE_REMOTE_REQUEST); + if (Cookies.get(CROSS_ACCESS_ACCOUNT_NUMBER) && initialAccount) { + try { + const { end_date } = JSON.parse(initialAccount); + /** + * Remove cross account request if it is expired + */ + if (new Date(end_date).getTime() <= Date.now()) { + crossAccountBouncer(); + } + } catch { + console.log('Unable to parse initial account. Using default account'); + Cookies.remove(CROSS_ACCESS_ACCOUNT_NUMBER); + } + } +} diff --git a/src/auth/logger.ts b/src/auth/logger.ts new file mode 100644 index 000000000..2edf9fa94 --- /dev/null +++ b/src/auth/logger.ts @@ -0,0 +1,11 @@ +// const pub = {}; + +export default (fileName: string) => { + return (msg: string | unknown) => { + if (window.console) { + if (window.localStorage && window.localStorage.getItem('chrome:auth:debug')) { + window.console.log(`[AUTH][${fileName}] ${msg}`); + } + } + }; +}; diff --git a/src/auth/offline.ts b/src/auth/offline.ts new file mode 100644 index 000000000..905cbb1bf --- /dev/null +++ b/src/auth/offline.ts @@ -0,0 +1,120 @@ +import { OFFLINE_REDIRECT_STORAGE_KEY, noAuthParam, offlineToken } from '../utils/consts'; +import axios, { AxiosResponse } from 'axios'; + +export type OfflineTokenResponse = { + access_token: string; + expires_in: number; + id_token: string; + 'not-before-policy': number; + refresh_expires_in: number; + refresh_token: string; + scope: string; + session_state: string; + token_type: string; +}; + +type OfflineSingleton = { + postbackUrl?: string; + response?: AxiosResponse; +}; + +const offline: OfflineSingleton = {}; + +export function getPostbackUrl() { + // let folks only do this once + const ret = offline.postbackUrl; + delete offline.postbackUrl; + return ret; +} + +export async function getOfflineToken(tokenUrl: string, clientId: string, redirectUrl: string) { + const postbackUrl = getPostbackUrl(); + + if (offline.response) { + return Promise.resolve(offline.response); + } + + if (!postbackUrl) { + // we need this postback URL because it contains parameters needed to + // call KC for the actual offline token + // thus we cant continue if it is missing + return Promise.reject('not available'); + } + const params = parseHashString(postbackUrl); + + return axios + .post>(tokenUrl, getPostDataString(getPostDataObject(redirectUrl, clientId, params.code)), { + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }) + .then((response) => { + offline.response = response; + return response; + }); +} + +export function getPostDataObject(redirectUrl: string, clientId: string, code: string) { + return { + code: code, + grant_type: 'authorization_code', + client_id: clientId, + redirect_uri: redirectUrl, + }; +} + +export function parseHashString(str: string) { + return str + .split('#')[1] + .split('&') + .reduce>((result, item) => { + const parts = item.split('='); + result[parts[0]] = parts[1]; + return result; + }, {}); +} + +function getPostDataString(obj: Record) { + return Object.entries(obj) + .map((entry) => { + return `${entry[0]}=${entry[1]}`; + }) + .join('&'); +} + +export function postbackUrlSetup() { + if (window.location.href.indexOf(offlineToken) !== -1) { + const { hash, origin, pathname } = window.location; + // attempt to use postback created from in previous doOffline call + const postbackUrl = new URL(localStorage.getItem(OFFLINE_REDIRECT_STORAGE_KEY) || `${origin}${pathname}`); + postbackUrl.hash = hash; + + // this is a UHC offline token postback + // we need to not let the JWT lib see this + // and try to use it + offline.postbackUrl = postbackUrl.toString(); + + // we do this because keycloak.js looks at the hash for its parameters + // and if found uses the params for its own use + // + // in the UHC offline post back case we *dont* + // want the params to be used by keycloak.js + // so we have to destroy this stuff and let regular auth routines happen + window.location.hash = ''; + + // nuke the params so that people dont see the ugly + const url = new URL(window.location.href); + url.searchParams.delete(noAuthParam); + window.history.pushState('offlinePostback', '', url.toString()); + } +} + +export function prepareOfflineRedirect(base = window.location.href) { + const url = new URL(base); + url.searchParams.delete(noAuthParam); + url.searchParams.append(noAuthParam, offlineToken); + const redirectUri = url.toString().replace('/?', '?'); + + if (redirectUri) { + localStorage.setItem(OFFLINE_REDIRECT_STORAGE_KEY, redirectUri); + } + return redirectUri; +} diff --git a/src/auth/platformUrl.ts b/src/auth/platformUrl.ts new file mode 100644 index 000000000..da904b6a3 --- /dev/null +++ b/src/auth/platformUrl.ts @@ -0,0 +1,27 @@ +import { DEFAULT_SSO_ROUTES } from '../utils/common'; +import logger from './logger'; +const log = logger('auth/platform.ts'); + +// Parse through keycloak options routes +export default function platformUlr(env: typeof DEFAULT_SSO_ROUTES, configSsoUrl?: string) { + // we have to use hard coded value for console.dev.redhat.com + // ugly hack + if (location.hostname === 'console.dev.redhat.com') { + return DEFAULT_SSO_ROUTES.dev.sso; + } + if (configSsoUrl) { + return configSsoUrl; + } + + const ssoEnv = Object.entries(env).find(([, { url }]) => url.includes(location.hostname)); + + if (ssoEnv) { + log(`SSO Url: ${ssoEnv?.[1].sso}`); + log(`Current env: ${ssoEnv?.[0]}`); + return ssoEnv?.[1].sso; + } else { + log('SSO url: not found, defaulting to qa'); + log('Current env: not found, defaulting to qa'); + return 'https://sso.qa.redhat.com/auth'; + } +} diff --git a/src/auth/setCookie.ts b/src/auth/setCookie.ts new file mode 100644 index 000000000..739fd269a --- /dev/null +++ b/src/auth/setCookie.ts @@ -0,0 +1,32 @@ +import logger from './logger'; + +const log = logger('auth/setCookie.ts'); + +function setCookieWrapper(str: string) { + window.document.cookie = str; +} + +const DEFAULT_COOKIE_NAME = 'cs_jwt'; + +function getCookieExpires(exp: number) { + // we want the cookie to expire at the same time as the JWT session + // so we take the exp and get a new GTMString from that + const date = new Date(0); + date.setUTCSeconds(exp); + return date.toUTCString(); +} + +export async function setCookie(token: string, expiresAt: number) { + log('Setting the cs_jwt cookie'); + if (token && token.length > 10) { + const cookieName = DEFAULT_COOKIE_NAME; + if (cookieName) { + setCookieWrapper(`${cookieName}=${token};` + `path=/wss;` + `secure=true;` + `expires=${getCookieExpires(expiresAt)}`); + setCookieWrapper(`${cookieName}=${token};` + `path=/ws;` + `secure=true;` + `expires=${getCookieExpires(expiresAt)}`); + setCookieWrapper(`${cookieName}=${token};` + `path=/api/tasks/v1;` + `secure=true;` + `expires=${getCookieExpires(expiresAt)}`); + setCookieWrapper(`${cookieName}=${token};` + `path=/api/automation-hub;` + `secure=true;` + `expires=${getCookieExpires(expiresAt)}`); + setCookieWrapper(`${cookieName}=${token};` + `path=/api/remediations/v1;` + `secure=true;` + `expires=${getCookieExpires(expiresAt)}`); + setCookieWrapper(`${cookieName}=${token};` + `path=/api/edge/v1;` + `secure=true;` + `expires=${getCookieExpires(expiresAt)}`); + } + } +} From e9beb386768adabc96e1ff58436527a95637cfe2 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Wed, 22 Nov 2023 11:18:05 +0100 Subject: [PATCH 07/23] Hook chrome UI into the new AUTH API. --- src/analytics/SegmentProvider.tsx | 8 +- src/bootstrap.tsx | 163 ++++-------------- src/chrome/create-chrome.ts | 38 ++-- src/components/ChromeRoute/ChromeRoute.tsx | 3 +- src/components/ErrorComponents/IDPError.tsx | 5 +- .../FeatureFlags/FeatureFlagsProvider.tsx | 8 +- src/components/Feedback/FeedbackModal.tsx | 16 +- src/components/Header/Header.tsx | 18 +- src/components/Header/Login.tsx | 5 +- src/components/Header/Tools.tsx | 7 +- src/components/Header/UserToggle.tsx | 53 ++++-- src/components/LibJWTContext/index.ts | 6 - src/components/RootApp/RootApp.tsx | 13 +- src/components/RootApp/ScalprumRoot.tsx | 52 +++--- src/hooks/useAllServices.ts | 40 +++-- src/hooks/useChromeServiceEvents.ts | 10 +- src/hooks/useUserSSOScopes.ts | 18 +- src/layouts/DefaultLayout.tsx | 6 +- src/utils/createCase.ts | 6 +- src/utils/debugFunctions.ts | 2 +- src/utils/iqeEnablement.ts | 12 +- src/utils/isAnsibleTrialFlagActive.ts | 2 +- src/utils/useAccessRequestNotifier.ts | 5 +- 23 files changed, 216 insertions(+), 280 deletions(-) delete mode 100644 src/components/LibJWTContext/index.ts diff --git a/src/analytics/SegmentProvider.tsx b/src/analytics/SegmentProvider.tsx index f14444e7e..e77382adb 100644 --- a/src/analytics/SegmentProvider.tsx +++ b/src/analytics/SegmentProvider.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef } from 'react'; +import React, { useContext, useEffect, useRef } from 'react'; import { AnalyticsBrowser } from '@segment/analytics-next'; import Cookie from 'js-cookie'; import { ITLess, isBeta, isProd } from '../utils/common'; @@ -10,6 +10,7 @@ import { ChromeState } from '../redux/store'; import SegmentContext from './SegmentContext'; import { resetIntegrations } from './resetIntegrations'; import { getUrl } from '../hooks/useBundle'; +import ChromeAuthContext from '../auth/ChromeAuthContext'; type SegmentEnvs = 'dev' | 'prod'; type SegmentModules = 'acs' | 'openshift' | 'hacCore'; @@ -160,7 +161,7 @@ const SegmentProvider: React.FC> = const disableIntegrations = localStorage.getItem('chrome:analytics:disable') === 'true' || isITLessEnv; const analytics = useRef(); const analyticsLoaded = useRef(false); - const user = useSelector(({ chrome: { user } }: { chrome: { user: ChromeUser } }) => user); + const { user } = useContext(ChromeAuthContext); const moduleAPIKey = useSelector(({ chrome: { modules } }: { chrome: ChromeState }) => activeModule && modules?.[activeModule]?.analytics?.APIKey); const { pathname } = useLocation(); @@ -268,7 +269,8 @@ const SegmentProvider: React.FC> = useEffect(() => { handleModuleUpdate(); - }, [activeModule, user]); + // need the json stringify to prevent the effect from running on every user update if not necessary + }, [activeModule, JSON.stringify(user)]); /** * This needs to happen in a condition and during first valid render! diff --git a/src/bootstrap.tsx b/src/bootstrap.tsx index f2dddd446..c0a703dfa 100644 --- a/src/bootstrap.tsx +++ b/src/bootstrap.tsx @@ -1,113 +1,24 @@ import React, { useEffect, useState } from 'react'; import { createRoot } from 'react-dom/client'; -import { Provider, useSelector, useStore } from 'react-redux'; +import { Provider, useSelector } from 'react-redux'; import { IntlProvider, ReactIntlErrorCode } from 'react-intl'; -import { matchRoutes } from 'react-router-dom'; import { spinUpStore } from './redux/redux-config'; import RootApp from './components/RootApp'; -import { loadModulesSchema } from './redux/actions'; -import Cookies from 'js-cookie'; -import { ACTIVE_REMOTE_REQUEST, CROSS_ACCESS_ACCOUNT_NUMBER } from './utils/consts'; -import auth, { LibJWT, createGetUserPermissions, crossAccountBouncer } from './auth'; -import sentry from './utils/sentry'; import registerAnalyticsObserver from './analytics/analyticsObserver'; -import { ITLess, generateRoutesList, getEnv, loadFedModules, noop, trustarcScriptSetup } from './utils/common'; +import { ITLess, getEnv, trustarcScriptSetup } from './utils/common'; +import { ReduxState } from './redux/store'; +import OIDCProvider from './auth/OIDCConnector/OIDCProvider'; +import ITLessProvider from './auth/ITLessConnector/ITLessProvider'; import messages from './locales/data.json'; import ErrorBoundary from './components/ErrorComponents/ErrorBoundary'; -import LibtJWTContext from './components/LibJWTContext'; -import { ReduxState } from './redux/store'; -import qe from './utils/iqeEnablement'; -import initializeJWT from './jwt/initialize-jwt'; -import AppPlaceholder from './components/AppPlaceholder'; -import { initializeVisibilityFunctions } from './utils/VisibilitySingleton'; -import { createGetUser } from './auth'; - -const language: keyof typeof messages = 'en'; - -const initializeAccessRequestCookies = () => { - const initialAccount = localStorage.getItem(ACTIVE_REMOTE_REQUEST); - if (Cookies.get(CROSS_ACCESS_ACCOUNT_NUMBER) && initialAccount) { - try { - const { end_date } = JSON.parse(initialAccount); - /** - * Remove cross account request if it is expired - */ - if (new Date(end_date).getTime() <= Date.now()) { - crossAccountBouncer(); - } - } catch { - console.log('Unable to parse initial account. Using default account'); - Cookies.remove(CROSS_ACCESS_ACCOUNT_NUMBER); - } - } -}; - -const libjwtSetup = (chromeConfig: { ssoUrl?: string }, ssoScopes: string[] = []) => { - const libjwt = auth({ ...chromeConfig, ssoScopes } || { ssoScopes }); - - libjwt.initPromise.then(() => { - return libjwt.jwt - .getUserInfo() - .then((chromeUser) => { - if (chromeUser) { - sentry(chromeUser); - } - }) - .catch(noop); - }); - - return libjwt; -}; const isITLessEnv = ITLess(); +const language: keyof typeof messages = 'en'; +const AuthProvider = isITLessEnv ? ITLessProvider : OIDCProvider; -const useInitialize = () => { - const [{ isReady, libJwt }, setState] = useState<{ isReady: boolean; libJwt?: LibJWT }>({ isReady: false, libJwt: undefined }); - const store = useStore(); - - const init = async () => { - const pathname = window.location.pathname; - // We have to use `let` because we want to access it once jwt is initialized - let libJwt: LibJWT | undefined = undefined; - // init qe functions, callback for libjwt because we want it to initialize before jwt is ready - qe.init(store, () => libJwt); - - // Load federated modules before the SSO init phase to obtain scope configuration - const { data: modulesData } = await loadFedModules(); - const { chrome: chromeConfig } = modulesData; - const routes = generateRoutesList(modulesData); - store.dispatch(loadModulesSchema(modulesData)); - // ge the initial module UI identifier - const initialModuleScope = matchRoutes( - routes.map(({ path, ...rest }) => ({ - ...rest, - path: `${path}/*`, - })), - // modules config does not include the preview fragment - pathname.replace(/^\/(preview|beta)/, '') - )?.[0]?.route?.scope; - const initialModuleConfig = initialModuleScope && modulesData[initialModuleScope]?.config; - initializeAccessRequestCookies(); - // create JWT instance - libJwt = libjwtSetup({ ...chromeConfig?.config, ...chromeConfig }, initialModuleConfig?.ssoScopes); - - await initializeJWT(libJwt); - const getUser = createGetUser(libJwt); - initializeVisibilityFunctions({ - getUser, - getToken: () => libJwt!.initPromise.then(() => libJwt!.jwt.getUserInfo().then(() => libJwt!.jwt.getEncodedToken())), - getUserPermissions: createGetUserPermissions(libJwt, getUser), - }); - - setState({ - libJwt, - isReady: true, - }); - }; - +const useInitializeAnalytics = () => { useEffect(() => { - init(); // setup trust arc trustarcScriptSetup(); // setup adobe analytics @@ -116,56 +27,46 @@ const useInitialize = () => { registerAnalyticsObserver(); } }, []); - - return { - isReady, - libJwt, - }; }; const App = () => { - const modules = useSelector(({ chrome }: ReduxState) => chrome?.modules); - const scalprumConfig = useSelector(({ chrome }: ReduxState) => chrome?.scalprumConfig); const documentTitle = useSelector(({ chrome }: ReduxState) => chrome?.documentTitle); const [cookieElement, setCookieElement] = useState(null); - const { isReady, libJwt } = useInitialize(); + + useInitializeAnalytics(); useEffect(() => { const title = typeof documentTitle === 'string' ? `${documentTitle} | ` : ''; document.title = `${title}console.redhat.com`; }, [documentTitle]); - return isReady && modules && scalprumConfig && libJwt ? ( - - - - ) : ( - - ); + return ; }; const entry = document.getElementById('chrome-entry'); if (entry) { const reactRoot = createRoot(entry); reactRoot.render( - { - if ( - (getEnv() === 'stage' && !window.location.origin.includes('foo')) || - localStorage.getItem('chrome:intl:debug') === 'true' || - !(error.code === ReactIntlErrorCode.MISSING_TRANSLATION) - ) { - console.error(error); - } - }} - > - - - - - - + + + { + if ( + (getEnv() === 'stage' && !window.location.origin.includes('foo')) || + localStorage.getItem('chrome:intl:debug') === 'true' || + !(error.code === ReactIntlErrorCode.MISSING_TRANSLATION) + ) { + console.error(error); + } + }} + > + + + + + + ); } diff --git a/src/chrome/create-chrome.ts b/src/chrome/create-chrome.ts index 3e24435bb..ece4f8fa9 100644 --- a/src/chrome/create-chrome.ts +++ b/src/chrome/create-chrome.ts @@ -1,6 +1,5 @@ import { createFetchPermissionsWatcher } from '../auth/fetchPermissions'; -import { LibJWT, createAuthObject } from '../auth'; -import { AppNavigationCB, ChromeAPI, ChromeUser, GenericCB, NavDOMEvent } from '@redhat-cloud-services/types'; +import { AppNavigationCB, ChromeAPI, GenericCB, NavDOMEvent } from '@redhat-cloud-services/types'; import { Store } from 'redux'; import { AnalyticsBrowser } from '@segment/analytics-next'; import get from 'lodash/get'; @@ -30,37 +29,33 @@ import { clearAnsibleTrialFlag, isAnsibleTrialFlagActive, setAnsibleTrialFlag } import chromeHistory from '../utils/chromeHistory'; import { ReduxState } from '../redux/store'; import { STORE_INITIAL_HASH } from '../redux/action-types'; -import { ChromeModule, FlagTagsFilter } from '../@types/types'; +import { FlagTagsFilter } from '../@types/types'; import useBundle, { getUrl } from '../hooks/useBundle'; import { warnDuplicatePkg } from './warnDuplicatePackages'; import { getVisibilityFunctions } from '../utils/VisibilitySingleton'; +import { ChromeAuthContextValue } from '../auth/ChromeAuthContext'; +import qe from '../utils/iqeEnablement'; export type CreateChromeContextConfig = { useGlobalFilter: (callback: (selectedTags?: FlagTagsFilter) => any) => ReturnType; - libJwt: LibJWT; - getUser: () => Promise; store: Store; - modulesConfig?: { - [key: string]: ChromeModule; - }; setPageMetadata: (pageOptions: any) => any; analytics: AnalyticsBrowser; quickstartsAPI: ChromeAPI['quickStarts']; helpTopics: ChromeAPI['helpTopics']; + chromeAuth: ChromeAuthContextValue; }; export const createChromeContext = ({ useGlobalFilter, - libJwt, - getUser, store, - modulesConfig, setPageMetadata, analytics, quickstartsAPI, helpTopics, + chromeAuth, }: CreateChromeContextConfig): ChromeAPI => { - const fetchPermissions = createFetchPermissionsWatcher(getUser); + const fetchPermissions = createFetchPermissionsWatcher(chromeAuth.getUser); const visibilityFunctions = getVisibilityFunctions(); const dispatch = store.dispatch; const actions = { @@ -100,7 +95,18 @@ export const createChromeContext = ({ const api: ChromeAPI = { ...actions, - auth: createAuthObject(libJwt, getUser, store, modulesConfig), + auth: { + getToken: chromeAuth.getToken, + getUser: chromeAuth.getUser, + logout: chromeAuth.logout, + login: chromeAuth.login, + doOffline: chromeAuth.doOffline, + getOfflineToken: chromeAuth.getOfflineToken, + qe: { + ...qe, + init: () => qe.init(store, chromeAuth.token), + }, + }, initialized: true, isProd, forceDemo: () => Cookies.set('cs_demo', 'true'), @@ -109,10 +115,10 @@ export const createChromeContext = ({ getApp: () => getUrl('app'), getEnvironment: () => getEnv(), getEnvironmentDetails: () => getEnvDetails(), - createCase: (fields?: any) => getUser().then((user) => createSupportCase(user!.identity, libJwt, fields)), + createCase: (fields?: any) => chromeAuth.getUser().then((user) => createSupportCase(user!.identity, chromeAuth.token, fields)), getUserPermissions: async (app = '', bypassCache?: boolean) => { - await getUser(); - return fetchPermissions(libJwt.jwt.getEncodedToken() || '', app, bypassCache); + const token = await chromeAuth.getToken(); + return fetchPermissions(token, app, bypassCache); }, identifyApp, hideGlobalFilter: (isHidden: boolean) => { diff --git a/src/components/ChromeRoute/ChromeRoute.tsx b/src/components/ChromeRoute/ChromeRoute.tsx index dbc64f690..ba9fed78a 100644 --- a/src/components/ChromeRoute/ChromeRoute.tsx +++ b/src/components/ChromeRoute/ChromeRoute.tsx @@ -11,6 +11,7 @@ import GatewayErrorComponent from '../ErrorComponents/GatewayErrorComponent'; import { ReduxState } from '../../redux/store'; import { DeepRequired } from 'utility-types'; import { ChromeUser } from '@redhat-cloud-services/types'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; export type ChromeRouteProps = { scope: string; @@ -26,7 +27,7 @@ const ChromeRoute = memo( ({ scope, module, scopeClass, path, props }: ChromeRouteProps) => { const dispatch = useDispatch(); const { setActiveHelpTopicByName } = useContext(HelpTopicContext); - const user = useSelector(({ chrome: { user } }: ReduxState) => user); + const { user } = useContext(ChromeAuthContext); const gatewayError = useSelector(({ chrome: { gatewayError } }: ReduxState) => gatewayError); const activeModule = useSelector(({ chrome: { activeModule } }: ReduxState) => activeModule); const defaultTitle = useSelector(({ chrome: { modules } }: ReduxState) => modules?.[scope]?.defaultDocumentTitle || scope); diff --git a/src/components/ErrorComponents/IDPError.tsx b/src/components/ErrorComponents/IDPError.tsx index 40329581a..80a5b9cea 100644 --- a/src/components/ErrorComponents/IDPError.tsx +++ b/src/components/ErrorComponents/IDPError.tsx @@ -1,16 +1,17 @@ -import React from 'react'; +import React, { useContext } from 'react'; import { Bullseye } from '@patternfly/react-core/dist/dynamic/layouts/Bullseye'; import { Button } from '@patternfly/react-core/dist/dynamic/components/Button'; import { EmptyState, EmptyStateBody, EmptyStateIcon } from '@patternfly/react-core/dist/dynamic/components/EmptyState'; import { Title } from '@patternfly/react-core/dist/dynamic/components/Title'; import ExclamationCircleIcon from '@patternfly/react-icons/dist/dynamic/icons/exclamation-circle-icon'; -import { logoutAllTabs } from '../../jwt/jwt'; import { useIntl } from 'react-intl'; import messages from '../../locales/Messages'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; const IDPError = () => { const intl = useIntl(); + const { logoutAllTabs } = useContext(ChromeAuthContext); return ( diff --git a/src/components/FeatureFlags/FeatureFlagsProvider.tsx b/src/components/FeatureFlags/FeatureFlagsProvider.tsx index 3ab57089c..a9b03fbee 100644 --- a/src/components/FeatureFlags/FeatureFlagsProvider.tsx +++ b/src/components/FeatureFlags/FeatureFlagsProvider.tsx @@ -1,11 +1,9 @@ -import React, { useMemo } from 'react'; +import React, { useContext, useMemo } from 'react'; import { FlagProvider, IFlagProvider, UnleashClient } from '@unleash/proxy-client-react'; import { DeepRequired } from 'utility-types'; -import { useSelector } from 'react-redux'; import { captureException } from '@sentry/react'; -import { ReduxState } from '../../redux/store'; -import { ChromeUser } from '@redhat-cloud-services/types'; import * as Sentry from '@sentry/react'; +import ChromeAuthContext, { ChromeAuthContextValue } from '../../auth/ChromeAuthContext'; const config: IFlagProvider['config'] = { url: `${document.location.origin}/api/featureflags/v0`, @@ -63,7 +61,7 @@ export let unleashClient: UnleashClient; export const getFeatureFlagsError = () => localStorage.getItem(UNLEASH_ERROR_KEY) === 'true'; const FeatureFlagsProvider: React.FC = ({ children }) => { - const user = useSelector, DeepRequired>((state) => state.chrome.user); + const { user } = useContext(ChromeAuthContext) as DeepRequired; unleashClient = useMemo( () => new UnleashClient({ diff --git a/src/components/Feedback/FeedbackModal.tsx b/src/components/Feedback/FeedbackModal.tsx index 30c21706d..c0117439a 100644 --- a/src/components/Feedback/FeedbackModal.tsx +++ b/src/components/Feedback/FeedbackModal.tsx @@ -8,11 +8,10 @@ import { Text, TextContent, TextVariants } from '@patternfly/react-core/dist/dyn import ExternalLinkAltIcon from '@patternfly/react-icons/dist/dynamic/icons/external-link-alt-icon'; import OutlinedCommentsIcon from '@patternfly/react-icons/dist/dynamic/icons/outlined-comments-icon'; - +import { DeepRequired } from 'utility-types'; import { ChromeUser } from '@redhat-cloud-services/types'; import { useDispatch, useSelector } from 'react-redux'; import { useIntl } from 'react-intl'; -import { DeepRequired } from 'utility-types'; import feedbackIllo from '../../../static/images/feedback_illo.svg'; import FeedbackForm from './FeedbackForm'; @@ -23,13 +22,9 @@ import messages from '../../locales/Messages'; import FeedbackError from './FeedbackError'; import InternalChromeContext from '../../utils/internalChromeContext'; -import LibtJWTContext from '../LibJWTContext'; import { createSupportCase } from '../../utils/createCase'; import './Feedback.scss'; - -export type FeedbackModalProps = { - user: DeepRequired; -}; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; export type FeedbackPages = | 'feedbackHome' @@ -41,14 +36,15 @@ export type FeedbackPages = | 'bugReportSuccess' | 'informDirectionSuccess'; -const FeedbackModal = memo(({ user }: FeedbackModalProps) => { +const FeedbackModal = memo(() => { const intl = useIntl(); const usePendoFeedback = useSelector(({ chrome: { usePendoFeedback } }) => usePendoFeedback); const isOpen = useSelector(({ chrome: { isFeedbackModalOpen } }) => isFeedbackModalOpen); const dispatch = useDispatch(); const [modalPage, setModalPage] = useState('feedbackHome'); const { getEnvironment } = useContext(InternalChromeContext); - const libjwt = useContext(LibtJWTContext); + const chromeAuth = useContext(ChromeAuthContext); + const user = chromeAuth.user as DeepRequired; const env = getEnvironment(); const isAvailable = env === 'prod' || env === 'stage'; const setIsModalOpen = (isOpen: boolean) => dispatch(toggleFeedbackModal(isOpen)); @@ -76,7 +72,7 @@ const FeedbackModal = memo(({ user }: FeedbackModalProps) => { {intl.formatMessage(messages.describeBugUrgentCases)}
- createSupportCase(user.identity, libjwt)}> + createSupportCase(user.identity, chromeAuth.token)}> {intl.formatMessage(messages.openSupportCase)} diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 5cb8c91c0..1499192bf 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -1,4 +1,4 @@ -import React, { Fragment, useState } from 'react'; +import React, { Fragment, useContext, useState } from 'react'; import ReactDOM from 'react-dom'; import Tools from './Tools'; import UnAuthtedHeader from './UnAuthtedHeader'; @@ -8,23 +8,21 @@ import SatelliteLink from './SatelliteLink'; import ContextSwitcher from '../ContextSwitcher'; import Feedback from '../Feedback'; import Activation from '../Activation'; -import { useSelector } from 'react-redux'; import Logo from './Logo'; import ChromeLink from '../ChromeLink'; import { Route, Routes, useLocation } from 'react-router-dom'; -import { ChromeUser } from '@redhat-cloud-services/types'; import { DeepRequired } from 'utility-types'; import './Header.scss'; -import { ReduxState } from '../../redux/store'; import { activationRequestURLs } from '../../utils/consts'; import { ITLess } from '../../utils/common'; import SearchInput from '../Search/SearchInput'; import AllServicesDropdown from '../AllServicesDropdown/AllServicesDropdown'; import Breadcrumbs, { Breadcrumbsprops } from '../Breadcrumbs/Breadcrumbs'; import useWindowWidth from '../../hooks/useWindowWidth'; +import ChromeAuthContext, { ChromeAuthContextValue } from '../../auth/ChromeAuthContext'; -const FeedbackRoute = ({ user }: { user: DeepRequired }) => { +const FeedbackRoute = () => { const paths = localStorage.getItem('chrome:experimental:feedback') === 'true' ? ['*'] @@ -32,14 +30,14 @@ const FeedbackRoute = ({ user }: { user: DeepRequired }) => { return ( {paths.map((path) => ( - } /> + } /> ))} ); }; export const Header = ({ breadcrumbsProps }: { breadcrumbsProps?: Breadcrumbsprops }) => { - const user = useSelector(({ chrome }: DeepRequired) => chrome.user); + const { user } = useContext(ChromeAuthContext) as DeepRequired; const search = new URLSearchParams(window.location.search).keys().next().value; const isActivationPath = activationRequestURLs.includes(search); const isITLessEnv = ITLess(); @@ -66,7 +64,7 @@ export const Header = ({ breadcrumbsProps }: { breadcrumbsProps?: Breadcrumbspro - {user?.identity?.account_number && !isITLessEnv && ReactDOM.createPortal(, document.body)} + {user?.identity?.account_number && !isITLessEnv && ReactDOM.createPortal(, document.body)} {user && isActivationPath && } @@ -106,8 +104,8 @@ export const Header = ({ breadcrumbsProps }: { breadcrumbsProps?: Breadcrumbspro }; export const HeaderTools = () => { - const user = useSelector(({ chrome }: ReduxState) => chrome?.user); - if (!user) { + const { ready } = useContext(ChromeAuthContext); + if (!ready) { return ; } return ; diff --git a/src/components/Header/Login.tsx b/src/components/Header/Login.tsx index 6611c0b25..08410cfb6 100644 --- a/src/components/Header/Login.tsx +++ b/src/components/Header/Login.tsx @@ -1,11 +1,12 @@ -import React from 'react'; +import React, { useContext } from 'react'; import { Button } from '@patternfly/react-core/dist/dynamic/components/Button'; -import { login } from '../../jwt/jwt'; import { useIntl } from 'react-intl'; import messages from '../../locales/Messages'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; const Login = () => { const intl = useIntl(); + const { login } = useContext(ChromeAuthContext); return ( + ))} + + ); +}; + +const Wrapper: React.FC> = ({ children, store }) => { + return {children}; +}; + +describe('ODIC Secured', () => { + let store: Store; + const testUser: User = { + access_token: 'foo', + expired: false, + expires_in: 100, + profile: { + aud: 'foo', + exp: 100, + iat: 100, + iss: 'foo', + sub: 'foo', + }, + scopes: [], + session_state: 'foo', + state: 'foo', + token_type: 'foo', + toStorageString: () => 'foo', + }; + + const authContextSettings: AuthProviderProps = { + authority: 'https://foo.bar/auth/realms/redhat-external', + client_id: 'cloud-services', + redirect_uri: 'localhost:8080', + post_logout_redirect_uri: 'http://foo.bar/auth/logout', + silent_redirect_uri: 'http://foo.bar/auth/silent-refresh', + response_type: 'code', + response_mode: 'fragment', + scope: 'openid profile email', + automaticSilentRenew: false, + loadUserInfo: true, + prompt: 'none', + metadata: { + authorization_endpoint: 'http://foo.bar/auth/realms/redhat-external/protocol/openid-connect/auth', + token_endpoint: 'http://foo.bar/auth/realms/redhat-external/protocol/openid-connect/token', + }, + }; + + const authContextValue: AuthContextProps = { + clearStaleState: () => Promise.resolve(), + settings: authContextSettings, + events: {} as AuthContextProps['events'], + removeUser: () => Promise.resolve(), + signinRedirect: () => Promise.resolve(), + isAuthenticated: true, + isLoading: false, + signinSilent: () => Promise.resolve(testUser), + signinPopup: () => Promise.resolve(testUser), + signinResourceOwnerCredentials: () => Promise.resolve(testUser), + signoutRedirect: () => Promise.resolve(), + signoutPopup: () => Promise.resolve(), + signoutSilent: () => Promise.resolve(), + querySessionStatus: () => Promise.resolve(null), + revokeTokens: () => Promise.resolve(), + startSilentRenew: () => Promise.resolve(), + stopSilentRenew: () => Promise.resolve(), + user: testUser, + }; + beforeEach(() => { + store = createStore((state = { chrome: {} }) => { + return state; + }); + }); + + it('should block rendering children if OIDC auth did not finish', () => { + cy.mount( + + + undefined}> + + + + + ); + + cy.contains(CHILD_TEXT).should('not.exist'); + }); + + it('should render children if OIDC auth did finish', () => { + cy.mount( + + + undefined}> + + + + + ); + + cy.contains(CHILD_TEXT).should('exist'); + }); + + it.only('Chrome auth context methods should be initialized and called on click', () => { + cy.mount( + + + undefined}> + + + + + ); + cy.contains(CHILD_TEXT).should('exist'); + const methodMapping = [ + ['logoutAllTabs', 'signoutRedirect'], + ['logout', 'signoutRedirect'], + ['login', 'signinRedirect'], + ['doOffline', 'signinRedirect'], + ]; + + // setup spy objects + const spies = methodMapping.reduce((acc, [, oidcName]) => { + if (!acc.find((mapped) => mapped === oidcName)) { + acc.push(oidcName); + } + + return acc; + }, []); + spies.forEach((oidcName) => { + const typedMethod = oidcName as keyof AuthContextProps; + cy.spy(authContextValue, typedMethod).as(oidcName); + }); + + const calls: { [key: string]: number } = {}; + + methodMapping.forEach(([chromeName, oidcName]) => { + cy.contains(new RegExp(`^${chromeName}$`)).click(); + calls[oidcName] = calls[oidcName] ? calls[oidcName] + 1 : 1; + }); + + spies.forEach((oidcName) => { + cy.get(`@${oidcName}`).should('have.callCount', calls[oidcName]); + }); + }); +}); diff --git a/cypress/component/UserToggle.cy.js b/cypress/component/UserToggle.cy.js index c41a20158..f38e7f207 100644 --- a/cypress/component/UserToggle.cy.js +++ b/cypress/component/UserToggle.cy.js @@ -6,16 +6,7 @@ import chromeReducer, { chromeInitialState } from '../../src/redux'; import ReducerRegistry from '@redhat-cloud-services/frontend-components-utilities/ReducerRegistry'; import { IntlProvider } from 'react-intl'; import UserToggle from '../../src/components/Header/UserToggle'; - -const Wrapper = ({ children, store }) => ( - - - - {children} - - - -); +import ChromeAuthContext from '../../src/auth/ChromeAuthContext'; const testUser = { identity: { @@ -39,6 +30,33 @@ const testUser = { }, }; +const chromeAuthContextValue = { + doOffline: () => Promise.resolve(), + getOfflineToken: () => Promise.resolve(), + getToken: () => Promise.resolve(''), + getUser: () => Promise.resolve(testUser), + login: () => Promise.resolve(), + loginAllTabs: () => Promise.resolve(), + logout: () => Promise.resolve(), + logoutAllTabs: () => Promise.resolve(), + ready: true, + token: '', + tokenExpires: 0, + user: testUser, +}; + +const Wrapper = ({ children, store }) => ( + + + + + {children} + + + + +); + describe('', () => { let store; beforeEach(() => { diff --git a/cypress/component/helptopics/HelpTopicManager.cy.tsx b/cypress/component/helptopics/HelpTopicManager.cy.tsx index 07f2a9a6c..462585992 100644 --- a/cypress/component/helptopics/HelpTopicManager.cy.tsx +++ b/cypress/component/helptopics/HelpTopicManager.cy.tsx @@ -12,38 +12,34 @@ import chromeReducer, { chromeInitialState } from '../../../src/redux'; import testUser from '../../fixtures/testUser.json'; import { Button } from '@patternfly/react-core/dist/dynamic/components/Button'; -import LibtJWTContext from '../../../src/components/LibJWTContext'; import { ChromeUser } from '@redhat-cloud-services/types'; -import { LibJWT } from '../../../src/auth'; import { initializeVisibilityFunctions } from '../../../src/utils/VisibilitySingleton'; +import ChromeAuthContext, { ChromeAuthContextValue } from '../../../src/auth/ChromeAuthContext'; -const jwt = { - getUserInfo: () => Promise.resolve(testUser as unknown as ChromeUser), - getEncodedToken: () => '', +const chromeUser: ChromeUser = testUser as unknown as ChromeUser; + +const chromeAuthContextValue: ChromeAuthContextValue = { + doOffline: () => Promise.resolve(), + getOfflineToken: () => Promise.resolve({} as any), + getToken: () => Promise.resolve(''), + getUser: () => Promise.resolve(chromeUser), + login: () => Promise.resolve(), + loginAllTabs: () => Promise.resolve(), + logout: () => Promise.resolve(), + logoutAllTabs: () => Promise.resolve(), + ready: true, + token: '', + tokenExpires: 0, + user: chromeUser, }; const Wrapper = ({ store }: { store: Store }) => ( - - - - - + + + undefined} cookieElement={null} /> + + ); @@ -81,6 +77,13 @@ describe('HelpTopicManager', () => { chrome: { modules: {}, ...chromeInitialState.chrome, + scalprumConfig: { + TestApp: { + name: 'TestApp', + appId: 'TestApp', + manifestLocation: '/foo/bar.json', + }, + }, moduleRoutes: [ { absolute: true, @@ -139,7 +142,7 @@ describe('HelpTopicManager', () => { cy.intercept('GET', '/api/chrome-service/v1/static/stable/stage/services/services.json', []); }); - it('should switch help topics drawer content', () => { + it.only('should switch help topics drawer content', () => { // change screen size cy.viewport(1280, 720); cy.window().then((win) => { diff --git a/cypress/snapshots/cypress/component/Banner.cy.tsx/Banner/ -- mounts.snap.png b/cypress/snapshots/cypress/component/Banner.cy.tsx/Banner/ -- mounts.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..e771b9f292eaae41cb0d31efea3d7a4ea06c49ab GIT binary patch literal 11219 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 literal 0 HcmV?d00001 diff --git a/cypress/snapshots/cypress/component/ContextSwitcher/ContextSwitcher.cy.js/ContextSwithcer/ -- should fire cross account request for internal user and render component.snap.png b/cypress/snapshots/cypress/component/ContextSwitcher/ContextSwitcher.cy.js/ContextSwithcer/ -- should fire cross account request for internal user and render component.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc7336400f986922d606e773ca6eaa328bc2670 GIT binary patch literal 6450 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 literal 0 HcmV?d00001 diff --git a/cypress/snapshots/cypress/component/ContextSwitcher/ContextSwitcher.cy.js/ContextSwithcer/ -- should not fire cross account request for non-internal user.snap.png b/cypress/snapshots/cypress/component/ContextSwitcher/ContextSwitcher.cy.js/ContextSwithcer/ -- should not fire cross account request for non-internal user.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..02fec02f082065441bffb9c041e6f2012603f46e GIT binary patch literal 1894 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8Y9Be?5)7S2IF)*;}db&7Qys!+||)3^T4XFnk`B91VoglrWkd jM$3fJf^nqO4*d03*`L(k^xFWeKN&n-{an^LB{Ts57o16w literal 0 HcmV?d00001 diff --git a/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render correctly with few nav items.snap.png b/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render correctly with few nav items.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a38b13c4a92d5f037fb843cc7c834d154ca35d GIT binary patch literal 38557 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 Sn8_9JQj$}bEqh=R@_zx|j>Dq> literal 0 HcmV?d00001 diff --git a/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render correctly with many nav items.snap.png b/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render correctly with many nav items.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..5941431cbbe458bafebe3c64b115353b553b9370 GIT binary patch literal 38518 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%0DxUa}T0Uu@!% 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�Pb)E-Vr2_}_XLvB!9 zy4~cBgWRG(w;!2}BfgXdZelOjE`GW07Be%btKBPSV%+(`f~8|CX`YL-<6%Y2TO&pw z37~ZaXA|$Bn_`*fUt4M6bNCfE9 zpx?|B`i#VA=Yg^#ff+0RFqj9+60JAKhYqLuQD(Oolb9jgl8;gnPPGv_w(acg6d3H^Jucd9SES~jjOMTWbH956}{)J;T_ z*M2nmYanD{6&{)Vi-g4PmKH8*3-yc^`*%PeJ<)@U+PTvb(RVyFf&xV8LHZAm4jS5_ zA_3oWQN=8b7}cxzvWMiFgdOspD|dJ}RIcT@+I?A03UVd0t43|&gNm^wH=;A|?xoqVCBo9om@`CvPbWxQV_zz(+FE zqGJp39-5DLG?cFf%t==zA)Nl=NsjKGw4c((3ho6=`1X@aYIUf{+aq->rG|oAd;R*G zaUUA=?tPSvF0ab56zNEC=*hX&l+42x^C86Wmwpip5s}}zIN(+zP1HYBS}}G{29IfV zpvnB@^R+q|k`F>?VN3G#Cm~Gu0jyLKq!#fxz;a5^utNd8eA;b&qf2W=i(kt#ZU76Q z>cU8>ygEe4EqW!cah{-q*4ZsAC)4S}{z~MXDAtAg>R26mT{!0nr9h$c-|sgTw{SVM z4SJ8>RL$op+Ufkd=_J_#I(wlT$JXoC?x!c0L@qf>IPimFw%S}S;$Fgmr(VcoIPF4^ zb?Dda-r$V1oG?WdURCdab0cq5X_BoD7iJ51lV&}1a=A!PHC{=xR^)!o`=*xzH0|P& zk`y05rnj-N0aAJZmG-~-Wmxe1+2kPAjXC9auF`fKI+P^zlu4iB*@EWV-LrjZJHo!n zq_|0S;DkRC@}Fft)$Jm@kn>m!1U*n2f%T{9`&7N=W-s`b0tgjYq{?rFb@e?0ImCO=cFg~V1Og7fV{FC88*{n(%y ziT+}3d3_0Xt@`*DBKnzEg`KTk!ITKC9s@O-n@Hpay~*iOL4uykC9d%E@}`RH}Ln(h=OJKAP7|D8!4?fjSZ*75$>slqc@ZG>3G%*PCz zC%0EGyeN3TM7yCem3bz<-9X@!-94yju(z*%TtEqix2_PBgQBpZ^pM0DG=0yB9;oF| zHW%sr5|;2>YkOZ$n?sT>lU9Q~scF-&biV00k?LvldrPouZme^0QgT4{t4h;Kw%Z1? zhlFnv`xSxcEGu?$i~*6V*}>cCoF}JpoZEV{U-vvS$IFx29Jbz(iEn3n{3DBD*dgw?NK@(Lp-Jf>H)$w+H_~!Yh~UNJ0@eQ`!!CR9}Ze1 zpGlRhsL?K8D;7TSu0q&3NYqqSn3+7go?67#9&Cvtoj|=|zM|x{AmxjGkdm?IG5Yut zs=5+oa@AL=x;>mGxdS^hF7&PG`=;~E{LN#(ae7KA&urhCJ5AotFMIF1H0dhv5-U%$ zw7xI*xtZ_D6?XPmS^H&p_P&XQ$@ljpKVX{gM4yegr(_?i`_%LWaNNG!qRiyZdU(^Z z;xq1493%CyESYz8iQBsnOH$M=-Z3R}XNij%7?u5vX-rexBYjgHg{IoX5&y;z_sI`& zR5Z~Pn{!-a9Y}AodEBZGW-S?)LrKA7pxirn=T8gOTdoOqT^VN_Cb}tD3lq~|NAq<# zmyO(ctM!$mec*~+`)#eb#^|s3>RgXB`yKgrea$VC}#x2Mg zG2dnG4n)7Da=yeG-Z0J5G0MHh$iW^YrMNbKm?yQRr7_#Ved{=7K3IujT_%vDNnGLQ zLbSJI`-g8E3ke4oSg@1h&g=Qi#CvdVY#ggdXHrwA_r~?PzMI8kzRxc#GLC*syj&*{ z5S;Ra8?WVSKm0ZO%)ZY0?mQWeVDa0q$d&sl7*9Iy6@rp=Dh=A{b*Iyi zg`@`;^(gVJKFNg7KUZ|Swi_QbFqkA|8t&Mn!L z-!cTBH8>BXMA~lt+QNTL_yAw9So@vow>xL%;w~M#oTIG=c&c^GKQ#(5J6?23(Z2{D z1VQC=Op$yW3i#r~027pX8fzufO~Xf)nUnYc7A{&(8un4AwnCTffXS!ckIdSqNS&-i zJ&H9Fuf`)b!~24q+4`rLUglUv7`6KTJ6X1>J)QL}r(r|omy%R=Cn&j=X?&M<93i}63@IS&{Z~2&DVsm6KeKyn2c`{Nie)*T%OHqzl&&{o0G6`FG z(XFT_$G0ui{pyus=5`-Z7GAk2{o%5)H_~P2ZBFMZy~eF+E4%3k?x%{dO_Y;2_zb>a z`nWfBRdaCjST_x(+mG*ZU-ILZ-OxThz4rM<@TQovn|f^; zI5p|wdj@|T0tP~#5fB_gaAQUww^k<8V`ugqI_zR+U31hA(ff-z$a&C$# zVt0Dm_g2+?_7tAIc))z{_hPLQ923f#R|%Z#`<8E1TGeBR;`S(k=ngUu{aSFAAJ8EOzVtqx}>c`zDWL`5s z8-eL#&b@e$UsS?lDy@qtI`OFV?J2P5m+cIoq+u?Nx$sKAH76`8f@87!4vAV73_Rbz zKmU9Eps?Y)Ayjj=MZ$+yHR?c8Q^If=)U&os?c8~Se%!CL{*Qf^X}mC~+0I{s_Nl*b z2`odgh@OA9+k}c3{`Nv3Pb7CtXl{NUTB*)ou}fV*b?QIL-m&_xmHqFYr5k-oe`J!t zb!@8s8>|06e+i-}8_O)^93kP={j-iA93i?%C!Q`D4;lHx!u$<;M0)D#W0#leSA+tr z$0|e5M(m0`b$T+p%L1Ges2STdVG&tP^f0GQr=FOYpOwx?TFGKjGjQ2i%Z7Ewn$bm$flN zEiIK8EBo_$rZ0+s(CC(|g%Z{ZOCS}6MRyP5mTp$^U0ITQDwTQ?A~3hSb4xt~)8kL8 zF8!yl8-wW7CpWBDDo{Nx_^$c+usg)dJ#&L&{H(zv8}9mO^QWa|Me()N?`NpsH+s|9&RVI1a4!P?WIMBR!EI_4smRfP`G%>Oibe;QxDPc zv()BB-x#DN&5oN5`@B%x{m`G4zJPz}JJ46y!D40aB3&NqP{s2!uEAycjW@5NA`b9%Zm_b}>OXw=upDUD0Rju8u?h#`2z<#AK;qi0 zax63~>^j(+Q&R(ngy4WKFz5>2*gLT8MVSr|yc+x*R{Jt}K;DD)>FVF|neiyIUuVmA zn7CtL#Z@hRO5&RNA!x0-p{3>K;e;qc#KsjFulhFBJf}9vKEK4pMdkFW8e`d|Bc{^7 zPg;#IMrS04$B*PChiH12UZasIE|y~6-&)?E2}c9> z@;`7){JzsAU4l=yzcU{Ety1wV8yfW+35o^0*ZIqw-*h4W&xxjvRrP$r| z%Up+aCok6P_-A>Zy&K$F(gk&t9DkT&c?;ITrro1yux??}?W)_Fk=%Y9CCh`W>c!cw zPU<=3+B^N^l_`P?(GcuPsww^9Qcp&u7u%%Ty}1sxCB7b={E0J?H`^I-CNG|&KDPYQ zO4pGDiqS)z=9S~sjv;;hCYv(hgRNy0n+vBd!uJ^qWME@e?`dmO_@C}%835cDP=Pz} zk=01b%9>AAX5KkVaW-Wqq;7iD zz2{RlgK0@dbECZHtq_rPD)M_o6IYS8?0Nd)swNqrc3h?+oO4s<}R*bd3hK5V*Fr~zj;K~(}`l^ z%*!za@t}buDJir-jdnU8NEkkN^l09rju7Y4a5cbx z0QGW!n)U^2kPRmZA5I5RzFbmQTmeE@)RSJL0f9XhI3lGM*b(eK)UkrYasRkA(?@8ULge&lR6L& z_&!l949+`7v(HlIzx)z3wp!Y7=MnS8HuXyk-Gx-d?%}S)w^W(?+T5f> zd-on-P6Xm{e)L$*#`*kGPwnH49pf=tT2MPUmJL;3dTk}O$G0_lu_JDJOUH)2GBc}d zbQra|CDTPK97S{LL)L}B$`N;PqcVybyI8FOMbM|Od_iJrI|_l_fzc+}cQ|Zxm4%$O z6`Nbv@2$F^eTsUXWS*|rV?176M0}XoBH=&%)G;KNi4nqwZrCLZ8c3T*C-2;VK&utF zRftP5bQK0`4W(c$EPeU%LQDtPK6qc%%<1~!&cQr?*8FR6mh5Q%UA25^sdPGj{bplo z7VCDe`a0>DIdhL6-1-#>q`H3UBa5Y#U;62sOS|XZOCfhUr{!j12S2MZ$);MbOD`Rx zE@4Ah7LfdJ%{15&*1Iehd$@1yx@HBSm2quE(^@BE2|xUwnFfvs0Fqw zIs1w6Pn=!b**P8-7}u@k;=P(R**lKw7j21MK@sFEyWY`8|93 z41gRq7_3ceK-mH)zyi%xaPW3;BACs6g#zqsVqA0pJ1ua7&bK)&Q1hFp0Rn>fq#F#V zfQnSrx-RP&7<2*k+fYDCuSKoB9~o`*mvaYlze+%Z7V;CRo~B z$DFs?Z_h3l7pPGWBg^%nc}n=lFB5SE;~y}@bxeUODrAHI;}24v>ulr%TFVtZd^rHH z3o8E(=Z`y?CRjSs1JqRu`9(#qo{zTQKIeVmhsMTz436~yJ&V~IfJF|HNznJGen-|f z`u?8YKz7C51fuaj07g7T&{BZp^7;3FZ<55m864CBDm`%1dJ}$8*|THUy^U#2OJcmB zVc@I+k#>5pQh?XgSlwW zDC?5~A=CBr6f=OXDayH&9am1B{8h@9Gp@bEb|lr%F`Yx-><&I}Av z7C8x?!~p0eLcAb!5oqRZNK_sa#+2TNA@ke3445#HP+?Z*Gylf2I%qRUkXRz?e>(&g z)E+*16rYu)>EOV3w7*e+Ar+sv4Ya>^!P~AvOp9Vem9Fe_HtH#hZ2i#8(@kiyBy*7oW5dHUR>-_=4>G)`-J zc}WNg3X0?bMOr>ZpbRya6C<0g2!c`|K5pdNCz{fSNb7!eFQgD?@Io7fefs_k%ub-R z-wqCTqGkf{Ljm@!mXM5WIfB2T2~p`R`Qi$b%H6w{02%}w8KeLsRQF9`;Y$sGZh`Kp z^mqEZla7<0zu-m3{BxB5 zhYzp11NKSOf2v3>GdRBAhnSa#5JJF}0A7VHSQK3PL`R$izm1l&x&x_q&>7pJe_GTL zP_3FlOGg3k3k&r$ILY4HK2uV+4vk-W#P3nOKo!`0ZKHnY3h-fn0cHi5I`Ig@44ne2}G!Kz?A{^e&Ed`e$Z|->A=MSm^OJ|AjAw= zV%tA)wL~z4I%>cA2srmOwBWED5GcM2ja@(-Z!Q8V)mKAWp)7%_*`KllJ|3;tK_Do= zKy}K8d=Y@7=m2oL!s6mw$LR)Oq%;7(r5uP)1DPX8TN~8ARv0upc-1}wR<9puGy~oz zB%ED202u8;LPBsRaQJc}!Kz#Wc`O9*!cG!ZcIso+~c%L`y&ukvk*kQYW7OKHNcFQFY7{?!Pii_Lq#dN2ECO`NRnj6SAMFH7zh$uWT%EirH z1i_+Ayw^lEfJiaWHpT(OAgCso^EsA_3%(DbaTq0Bo(t~+px&p1)4l4(t?I^;sGTC9 z>pkIjw1(~!Ao&4iR};8U$I5O6Fcnyi#_4__sAHo7OyRQI?&=uq|5Y$CA>pf=(2wiT zvRGUkDG4Odp=l@yU^@`n5X5xYhsw%?5Xu60w~!wxA_m|Q;7%Zb55P(Y7XYtO((M}% zOX$q&{8M3Jk|2C$)H7j0$0=!`%)CG0N(NN8MXI0`LtnpBU3^j=Xm6{(0z)_J8*uWo~;%B-Lo!%Kt26OL}Vm*Q=U)# z&l1XUUtPWZyPFG;LkFtZ_k4VyIN!zQPYy`}=<<`W$TC8s=;!}uQs_@n1<=X*Dc^nL z@bGYm6$WTWO;+cbwPd^?MI>T$V`OvA3}17?muzR}g0dj2%g%DT4Z>0Ge%P4M%t*9Q zYS_J@?`ho=Z4SRG@@K9@OhQHhO>9o~n`j?TFfml3_1NNk0>LA`Ztkc93~*vsIZ#houb!A84p#v&t@ z8GO*1!S%b})*@@|*oiAWXPl&*7v7qEIq5IYTOq*Yr=HJOiA1n4SO}#S!btE80Egta zovA&b6G^OK%=Dw8{wR`8x8krAYcFoPr5lqGxfP!ZXOB-P@vzv^M%M)vuz1H=<94Z? zb#NQK|K*{Goos&8d+%WWtdHGgophqEtxGx8aVFSbuGKx(hcjcbZvC>U*idO^(_L}1 z#us5Ra%~?$&h}k`cD*yM|8d`jzTOOeFUjeew=_dtN`a~{U2?4a-Q27-)l91&5e|wn zr`Igw=fk4hDy;|N)iRDQYG{<04T$7>8uS(ytedw^mTEO|jt-?Byuqgvho|aC#0(yb z_Gay{?YK@13l#KQ?e2Up{&tQTB;cK3CYc z*mk2zY*(s0Us_w|1|se-r(GW--5S?8b(vqoY}8Y@ z>v+KS#s<2tn1TYG7GxdMXJvhCmFWw=D$GFNp0v2=gqK0@^tV=> zvV`RAiD9Q@nU3Qq>R;CR7E6Zkk+X~OGOp>cq1cX! zX*G*ql2V@PbO9OsSL?C;e$r9Fxac?uS1|_9wU=f)QoSnJ`LGU?f(y`~k99-}rP2aE z6m>-KFERVk+wSh7kRjRS3=zMq-J0X10~F5aHGQcg$V`(_ zz3?aZ4N@6y@D4xHTWY1WnSH=B?6NG~HLOs&v#r~Rn2Z`4z3mIW_%qjS-gI=XfLYuw zdAVsGq>GX(u>Ce$NKMxHZ5wh5O-v|$YWd7nO6CJXVAnwZfX$g>W#*T`qF{coIXgU3 z^%o#_EK*bR8QmA4&3$1`3t}s1O{L)vB5p1Z{2pUnu~0Oo)|c@jzBE)j&B6iR*ht!2rNSvqm8GVGI7H-39(Es4Z_;7;#(eFXeo`n1zx8c3?KS3F&0Q z`b@FJ5*pE4Qu@_gSvn0%{U*KLgKn7UPOH^Vs4AYv0YR>_$es^O@(7Tbky7t(45DE^ zVQLR55VU)qQF=I5;f!BSckeqgKa-$@DGl#X!hV0}Z7&5y${~A1I|=n~rFbY1(arhr zA?<~c-{B&Zxqv|T5RJyweat#p5CBvlA{uCUv_Cr^tvCZxeO`20OEFKsP#0}@+hF?% zd;WNlc~ybXdPpjpmMJrF^1_f~x4lDHFJe}R1KF~?f5%?v(arI4&#;aw@TBADWEJ7m z-D5ROKE^U;Lm87|Q@^?FeP7J=)BtYMyrOoZ&dkXw9JXi|eY1Zn$x*~LGpni0O3K4q z^M%YY2ZEG){yj2zenHh(ap$KgQn-qE+DZe7Nw?GAJ|c`%Q*Ut)gHdF4cY>rwq`AYC zua~GFv?|MEV}SV4+!hM1EA#Z{H6SRO4IhN9o)k9F9jd5SovjU(IdRM9_8iDRi=B@HT63mOMrY6e(j1sMtF-1mJ&}+*q{^c zDra^YlP@UOaqiZ49?m$yQGj_=1i_D>kp~=eXeB28Up>Ba;Y<~GWCj6{_j)aay`vwW zYmeaM;aLDN-wnWd#)tvL5^w<_&OKOy(ItSyT?TM%KkAORd%gqwnehj=>mX*0Xa>R8 z!HVgb3WzBo>>L=!$$=nR!~TilI=!5L=c54-Dty2t4+ep^|Jf;Ey^sT91*lxU<+U4w z1Q0B+%gWjs@}v6t0T8kuAYck#zn+r^>1T*$x;jxCPY7ezDgYxCfY)@jv~KI`(*n#V zK$}=rj)AB_UQrQBw1F3+BfyrT)c~)47X)%5fyKo;h*Hxa!Y?gS9OIKNW)A>DI1R^w5esFoGl`7#~I8&+P|W^Ag&iTn^xK4c-Uk z74ma)6GNkC3i#>=fH>I?Ab-l5nj9cD`UUOWIA_AO(0-^0b@9*1FjSbI$`06J-8pJiuXV{sQnErH8LB z5(u08;O6IFhOPi|m-b)Zg@NuE0)*v;os11~W@Zo{+*kb@v{ex;)EA-e$dzK4A@{cg z#GIlKISs_fQGF}BI`e>tiv*1=QUww?q#zsv7#4d_4Rf({2__H<0y?o1J7D02g@u8D zPuo<0b|GFo59vot^C4sQjBqs{9PtT*)1-_2WdX=3fc^Gk2jpZ;KBj?MJ$)*< z3%UPvbjk(>bjw`l558T>e@A^b*FkElsIYLxhzY<%ySr5Y;SxaOUX_Dv4ngTi#H2$3 zV7-Y{0YO9E9Kh28gUeYAAe9s>L0~f*&Ry~nOav%@1@JZG$vq0b?d|O#S)*$TY6MhI zK$xGK2Tc($x~^j)=~@p3eg`ceK;w{=&BRopwk#mzBjB3-=aeHrQau4GFzT<~y-NVe z7wn5Jt85Uz0=#et2$agrTk*hH2T>G&pn>uAPaa2t^@X_>2$<61z{e%NR#+3C9dyVY zta~>0JbYx_K1Kv$F_5l-N&x{l6yB1wLJ@G@(V1NJTZigb@AWT$m$HI}e92w2!2btb Ck4)(R literal 0 HcmV?d00001 diff --git a/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render with footer at the screen bottom.snap.png b/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render with footer at the screen bottom.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a38b13c4a92d5f037fb843cc7c834d154ca35d GIT binary patch literal 38557 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 Sn8_9JQj$}bEqh=R@_zx|j>Dq> literal 0 HcmV?d00001 diff --git a/cypress/snapshots/cypress/component/UserToggle.cy.js/UserToggle/ -- render correctly.snap.png b/cypress/snapshots/cypress/component/UserToggle.cy.js/UserToggle/ -- render correctly.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..ea221e674f1d9c4285a4e9f06737f800fae1ffc6 GIT binary patch literal 8415 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 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index b65ddf635..83a405207 100644 --- a/package-lock.json +++ b/package-lock.json @@ -136,6 +136,7 @@ "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.11.1", + "whatwg-fetch": "^3.6.19", "yargs": "^17.7.1" }, "engines": { @@ -28993,6 +28994,12 @@ "node": ">=12" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", + "dev": true + }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", @@ -50234,6 +50241,12 @@ "iconv-lite": "0.6.3" } }, + "whatwg-fetch": { + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", + "dev": true + }, "whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", diff --git a/package.json b/package.json index 6d8a2d864..726e75d82 100644 --- a/package.json +++ b/package.json @@ -125,6 +125,7 @@ "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.11.1", + "whatwg-fetch": "^3.6.19", "yargs": "^17.7.1" }, "dependencies": { diff --git a/src/analytics/analytics.test.js b/src/analytics/analytics.test.js deleted file mode 100644 index 9c12da904..000000000 --- a/src/analytics/analytics.test.js +++ /dev/null @@ -1,53 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const analytics = require('./'); -const user = require('../jwt/user'); -const token = require('../../testdata/token.json'); -const externalToken = require('../../testdata/externalToken.json'); -const ibmToken = require('../../testdata/ibmToken.json'); - -describe('User + Analytics', () => { - const getPendoConf = analytics.getPendoConf; - describe('buildUser + getPendoConf internal', () => { - test('should build a valid internal Pendo config', () => { - const conf = getPendoConf(user.buildUser(token)); - expect(conf).toMatchObject({ - account: { - id: '540155', - }, - visitor: { - id: '5299389_redhat', - internal: true, - lang: 'en_US', - }, - }); - }); - - test('should build a valid external Pendo config', () => { - const conf = getPendoConf(user.buildUser(externalToken)); - expect(conf).toMatchObject({ - account: { - id: '540155', - }, - visitor: { - id: '5299389', - internal: false, - lang: 'en_US', - }, - }); - }); - - test('should build a valid IBM pendo config', () => { - const conf = getPendoConf(user.buildUser(ibmToken)); - expect(conf).toMatchObject({ - account: { - id: '540155', - }, - visitor: { - id: '5299389_ibm', - internal: false, - lang: 'en_US', - }, - }); - }); - }); -}); diff --git a/src/analytics/analytics.test.ts b/src/analytics/analytics.test.ts new file mode 100644 index 000000000..8e886e64d --- /dev/null +++ b/src/analytics/analytics.test.ts @@ -0,0 +1,77 @@ +import { getPendoConf } from '.'; +import token from '../../testdata/token.json'; +import externalToken from '../../testdata/externalToken.json'; +import ibmToken from '../../testdata/ibmToken.json'; +import { DeepRequired } from 'utility-types'; +import { ChromeUser } from '@redhat-cloud-services/types'; + +function buildUser(token: any): DeepRequired { + return { + entitlements: {}, + identity: { + account_number: token.account_number || '540155', + type: 'User', + internal: { + org_id: token.org_id || '1979710', + account_id: token.account_id || '5299389', + }, + org_id: token.org_id || '1979710', + user: { + email: token.email || '', + first_name: token.first_name || 'John', + is_active: token.is_active || true, + is_internal: token.is_internal || false, + is_org_admin: token.is_org_admin || false, + last_name: token.last_name || 'Doe', + locale: token.locale || 'en_US', + username: token.username || 'test-user', + }, + }, + }; +} + +describe('User + Analytics', () => { + describe('buildUser + getPendoConf internal', () => { + test('should build a valid internal Pendo config', () => { + const conf = getPendoConf(buildUser(token)); + expect(conf).toMatchObject({ + account: { + id: '540155', + }, + visitor: { + id: '5299389_redhat', + internal: true, + lang: 'en_US', + }, + }); + }); + + test('should build a valid external Pendo config', () => { + const conf = getPendoConf(buildUser(externalToken)); + expect(conf).toMatchObject({ + account: { + id: '540155', + }, + visitor: { + id: '5299389', + internal: false, + lang: 'en_US', + }, + }); + }); + + test('should build a valid IBM pendo config', () => { + const conf = getPendoConf(buildUser(ibmToken)); + expect(conf).toMatchObject({ + account: { + id: '540155', + }, + visitor: { + id: '5299389_ibm', + internal: false, + lang: 'en_US', + }, + }); + }); + }); +}); diff --git a/src/analytics/index.ts b/src/analytics/index.ts index 3a469ff2a..3c7f599c3 100644 --- a/src/analytics/index.ts +++ b/src/analytics/index.ts @@ -1,5 +1,3 @@ -'use strict'; - import { isBeta, isProd } from '../utils/common'; import { ChromeUser } from '@redhat-cloud-services/types'; import { DeepRequired } from 'utility-types'; diff --git a/src/auth/OIDCConnector/OIDCSecured.tsx b/src/auth/OIDCConnector/OIDCSecured.tsx index 47a6adf4a..0d700779d 100644 --- a/src/auth/OIDCConnector/OIDCSecured.tsx +++ b/src/auth/OIDCConnector/OIDCSecured.tsx @@ -79,7 +79,7 @@ export function OIDCSecured({ const dispatch = useDispatch(); const [state, setState] = useState({ ready: false, - logoutAllTabs: (bounce) => { + logoutAllTabs: (bounce = true) => { authChannel.postMessage({ type: 'logout' }); logout(auth, bounce); }, @@ -164,7 +164,9 @@ export function OIDCSecured({ }, [JSON.stringify(auth.user), auth.isAuthenticated]); useEffect(() => { - startChrome(); + if (!auth.error) { + startChrome(); + } }, [auth]); if (!auth.isAuthenticated || !state.ready) { diff --git a/src/auth/OIDCConnector/createUUID.test.ts b/src/auth/OIDCConnector/createUUID.test.ts new file mode 100644 index 000000000..861098a35 --- /dev/null +++ b/src/auth/OIDCConnector/createUUID.test.ts @@ -0,0 +1,30 @@ +import createUUID from './createUUID'; + +describe('createUUID', () => { + it('should generate a valid UUID', () => { + const uuid = createUUID(); + expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i); + }); + + it('should generate a different UUID each time', () => { + const uuid1 = createUUID(); + const uuid2 = createUUID(); + expect(uuid1).not.toBe(uuid2); + }); + + it('should generate a UUID with the correct length', () => { + const uuid = createUUID(); + expect(uuid.length).toBe(36); + }); + + // test when a window.crypto is not available + it('should generate a valid UUID when window.crypto is not available', () => { + const crypto = window.crypto; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + window.crypto = null; + const uuid = createUUID(); + expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i); + window.crypto = crypto; + }); +}); diff --git a/src/auth/crossAccountBouncer.test.ts b/src/auth/crossAccountBouncer.test.ts new file mode 100644 index 000000000..eabd9d995 --- /dev/null +++ b/src/auth/crossAccountBouncer.test.ts @@ -0,0 +1,45 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import Cookies from 'js-cookie'; +import { ACCOUNT_REQUEST_TIMEOUT, ACTIVE_REMOTE_REQUEST, CROSS_ACCESS_ACCOUNT_NUMBER, CROSS_ACCESS_ORG_ID } from '../utils/consts'; +import crossAccountBouncer from './crossAccountBouncer'; + +describe('crossAccountBouncer', () => { + const mockCookiesGet = jest.spyOn(Cookies, 'get'); + const mockCookiesRemove = jest.spyOn(Cookies, 'remove'); + const reloadMock = jest.fn(); + beforeAll(() => { + // @ts-ignore + delete window.location; + // @ts-ignore + window.location = { + reload: reloadMock, + }; + }); + + beforeEach(() => { + mockCookiesGet.mockClear(); + mockCookiesRemove.mockClear(); + localStorage.removeItem(ACTIVE_REMOTE_REQUEST); + localStorage.removeItem(ACCOUNT_REQUEST_TIMEOUT); + reloadMock.mockClear(); + }); + + it('sets localStorage request timeout and removes active remote request', () => { + // @ts-ignore + mockCookiesGet.mockReturnValueOnce('some-cookie'); + crossAccountBouncer(); + expect(localStorage.getItem(ACCOUNT_REQUEST_TIMEOUT)).toEqual('some-cookie'); + expect(localStorage.getItem(ACTIVE_REMOTE_REQUEST)).toBeNull(); + expect(reloadMock).toHaveBeenCalledTimes(1); + }); + + it('does not set localStorage and calls Cookies.remove', () => { + // @ts-ignore + mockCookiesGet.mockReturnValueOnce(undefined); + crossAccountBouncer(); + expect(localStorage.getItem(ACCOUNT_REQUEST_TIMEOUT)).toBeNull(); + expect(mockCookiesRemove).toHaveBeenCalledWith(CROSS_ACCESS_ACCOUNT_NUMBER); + expect(mockCookiesRemove).toHaveBeenCalledWith(CROSS_ACCESS_ORG_ID); + expect(reloadMock).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/auth/fetchPermissions.test.js b/src/auth/fetchPermissions.test.js index 8f6fde5fd..1bda6bedb 100644 --- a/src/auth/fetchPermissions.test.js +++ b/src/auth/fetchPermissions.test.js @@ -13,8 +13,6 @@ jest.mock('./rbac', () => () => { import { createFetchPermissionsWatcher } from './fetchPermissions'; -jest.mock('../jwt/jwt'); - describe('fetchPermissions', () => { let fetchPermissions; let getUser = jest.fn().mockImplementation(() => diff --git a/src/auth/getInitialScope.test.ts b/src/auth/getInitialScope.test.ts new file mode 100644 index 000000000..2807955f7 --- /dev/null +++ b/src/auth/getInitialScope.test.ts @@ -0,0 +1,35 @@ +import { RouteDefinition } from '../@types/types'; +import getInitialScope from './getInitialScope'; + +describe('getInitialScope', () => { + const mockRoutes: RouteDefinition[] = [ + { + manifestLocation: 'https://some.url', + module: 'some-module', + path: '/some-module', + scope: 'some-scope', + }, + { + manifestLocation: 'https://some.url', + module: 'no-scoped-module', + path: '/no-scoped-module', + scope: 'no-scoped-module', + }, + ]; + + it('should return the scope of the first matching route', () => { + expect(getInitialScope(mockRoutes, '/some-module')).toBe('some-scope'); + }); + + it('should return the scope of the first matching route for nested routes', () => { + expect(getInitialScope(mockRoutes, '/some-module/some-path')).toBe('some-scope'); + }); + + it('should return the scope of the first matching route for nested routes with a trailing slash', () => { + expect(getInitialScope(mockRoutes, '/some-module/some-path/')).toBe('some-scope'); + }); + + it('should return undefined if no matching route is found', () => { + expect(getInitialScope(mockRoutes, '/no-module')).toBeUndefined(); + }); +}); diff --git a/src/auth/initializeAccessRequestCookies.test.ts b/src/auth/initializeAccessRequestCookies.test.ts new file mode 100644 index 000000000..11fa99827 --- /dev/null +++ b/src/auth/initializeAccessRequestCookies.test.ts @@ -0,0 +1,81 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import initializeAccessRequestCookies from './initializeAccessRequestCookies'; +import * as crossAccountBouncer from './crossAccountBouncer'; +import Cookies from 'js-cookie'; +import { ACTIVE_REMOTE_REQUEST, CROSS_ACCESS_ACCOUNT_NUMBER } from '../utils/consts'; + +describe('initializeAccessRequestCookies', () => { + const mockCrossAccountBouncer = jest.spyOn(crossAccountBouncer, 'default'); + const mockCookiesGet = jest.spyOn(Cookies, 'get'); + const mockCookiesRemove = jest.spyOn(Cookies, 'remove'); + beforeAll(() => { + // @ts-ignore + delete window.location; + // @ts-ignore + window.location = {}; + }); + beforeEach(() => { + mockCrossAccountBouncer.mockClear(); + localStorage.removeItem(ACTIVE_REMOTE_REQUEST); + // @ts-ignore + window.location = {}; + }); + + it('does nothing if no initial account is set in localStorage and no Cookie is set', () => { + initializeAccessRequestCookies(); + expect(mockCrossAccountBouncer).not.toHaveBeenCalled(); + }); + + it('does nothing if Cookie is set but no initial account is set in localStorage', () => { + // @ts-ignore + mockCookiesGet.mockReturnValueOnce('some-cookie'); + initializeAccessRequestCookies(); + expect(mockCrossAccountBouncer).not.toHaveBeenCalled(); + }); + + // does nothing if localStorage is set but no Cookie is set + it('does nothing if localStorage is set but no Cookie is set', () => { + // @ts-ignore + mockCookiesGet.mockReturnValueOnce(undefined); + localStorage.setItem(ACTIVE_REMOTE_REQUEST, 'some-local-storage'); + initializeAccessRequestCookies(); + expect(mockCrossAccountBouncer).not.toHaveBeenCalled(); + }); + + it('calls Cookies.remove if the initial account fails to parse', () => { + // @ts-ignore + mockCookiesGet.mockReturnValueOnce('some-cookie'); + localStorage.setItem(ACTIVE_REMOTE_REQUEST, 'some-local-storage'); + initializeAccessRequestCookies(); + expect(mockCookiesRemove).toHaveBeenCalledWith(CROSS_ACCESS_ACCOUNT_NUMBER); + }); + + it('calls crossAccountBouncer if the initial account is expired', () => { + // @ts-ignore + mockCookiesGet.mockReturnValueOnce('some-cookie'); + localStorage.setItem( + ACTIVE_REMOTE_REQUEST, + JSON.stringify({ + // past date + end_date: '2020-01-01', + }) + ); + initializeAccessRequestCookies(); + expect(mockCrossAccountBouncer).toHaveBeenCalled(); + }); + + // does nothing if the initial account is not expired + it('does nothing if the initial account is not expired', () => { + // @ts-ignore + mockCookiesGet.mockReturnValueOnce('some-cookie'); + localStorage.setItem( + ACTIVE_REMOTE_REQUEST, + JSON.stringify({ + // future date + end_date: new Date(new Date().getTime() + 1000 * 60 * 60 * 24).toISOString(), + }) + ); + initializeAccessRequestCookies(); + expect(mockCrossAccountBouncer).not.toHaveBeenCalled(); + }); +}); diff --git a/src/auth/offline.test.ts b/src/auth/offline.test.ts new file mode 100644 index 000000000..fe4a858a9 --- /dev/null +++ b/src/auth/offline.test.ts @@ -0,0 +1,123 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import { getOfflineToken, getPostDataObject, parseHashString, postbackUrlSetup, prepareOfflineRedirect } from './offline'; +import { OFFLINE_REDIRECT_STORAGE_KEY, offlineToken } from '../utils/consts'; + +jest.mock('axios', () => { + const axios = jest.requireActual('axios'); + return { + __esModule: true, + ...axios, + default: { + ...axios.default, + post: () => + Promise.resolve({ + data: { + foo: 'bar', + }, + }), + }, + }; +}); + +describe('offline', () => { + const pushStateMock = jest.fn(); + beforeAll(() => { + // @ts-ignore + delete window.location; + // @ts-ignore + delete window.history; + // @ts-ignore + window.location = {}; + // @ts-ignore + window.history = {}; + }); + beforeEach(() => { + localStorage.removeItem(OFFLINE_REDIRECT_STORAGE_KEY); + // @ts-ignore + window.location = { + href: 'http://console.redhat.com', + origin: 'http://console.redhat.com', + }; + // @ts-ignore + window.history = { + pushState: pushStateMock, + }; + pushStateMock.mockClear(); + }); + + it('creates valid postback data object', () => { + const postData = getPostDataObject('http://localhost:3000', 'clientId', 'code'); + expect(postData).toEqual({ + code: 'code', + grant_type: 'authorization_code', + client_id: 'clientId', + redirect_uri: 'http://localhost:3000', + }); + }); + + it('parses hash string', () => { + const hashString = '#code=code&state=state'; + const parsed = parseHashString(hashString); + expect(parsed).toEqual({ + code: 'code', + state: 'state', + }); + }); + + it('can parse hash string with no state', () => { + const hashString = '#code=code'; + const parsed = parseHashString(hashString); + expect(parsed).toEqual({ + code: 'code', + }); + }); + + it('can prase empty hash string', () => { + const hashString = '#'; + const parsed = parseHashString(hashString); + expect(parsed).toEqual({}); + }); + + it('can parse empty string', () => { + const hashString = ''; + const parsed = parseHashString(hashString); + expect(parsed).toEqual({}); + }); + + it('prepares offline redirect URL from current location.href', () => { + const offlineRedirectUrl = prepareOfflineRedirect(); + const redirectUri = `${window.location.origin}?noauth=${offlineToken}`; + expect(offlineRedirectUrl).toEqual(redirectUri); + expect(localStorage.getItem(OFFLINE_REDIRECT_STORAGE_KEY)).toEqual(redirectUri); + }); + + it('prepares offline redirect URL from custom url base', () => { + const base = 'https://example.com'; + const offlineRedirectUrl = prepareOfflineRedirect(base); + const redirectUri = `${base}?noauth=${offlineToken}`; + expect(offlineRedirectUrl).toEqual(redirectUri); + expect(localStorage.getItem(OFFLINE_REDIRECT_STORAGE_KEY)).toEqual(redirectUri); + }); + + it('postbackUrlSetup does nothing if URL does not contain offline token', () => { + postbackUrlSetup(); + expect(pushStateMock).not.toHaveBeenCalled(); + }); + + it('postbackUrlSetup should remove delete the offline query param from url', () => { + // prevent issues in jsdom + pushStateMock.mockImplementation(() => undefined); + window.location.href = `http://console.redhat.com?noauth=${offlineToken}`; + postbackUrlSetup(); + expect(pushStateMock).toHaveBeenCalledWith('offlinePostback', '', 'http://console.redhat.com/'); + }); + + it('getOfflineToken should retrieve offline token', async () => { + const token = await getOfflineToken('http://localhost:3000/auth/token', 'clientId', 'http://localhost:3000'); + expect(token).toEqual({ + data: { + foo: 'bar', + }, + }); + }); +}); diff --git a/src/auth/offline.ts b/src/auth/offline.ts index 905cbb1bf..b92a6fbf4 100644 --- a/src/auth/offline.ts +++ b/src/auth/offline.ts @@ -18,7 +18,7 @@ type OfflineSingleton = { response?: AxiosResponse; }; -const offline: OfflineSingleton = {}; +export const offline: OfflineSingleton = {}; export function getPostbackUrl() { // let folks only do this once @@ -62,14 +62,19 @@ export function getPostDataObject(redirectUrl: string, clientId: string, code: s } export function parseHashString(str: string) { - return str - .split('#')[1] - .split('&') - .reduce>((result, item) => { - const parts = item.split('='); - result[parts[0]] = parts[1]; - return result; - }, {}); + try { + return str + .split('#')[1] + .split('&') + .reduce>((result, item) => { + const parts = item.split('='); + result[parts[0]] = parts[1]; + return result; + }, {}); + } catch { + console.error('failed to parse hash string', str); + return {}; + } } function getPostDataString(obj: Record) { diff --git a/src/auth/platformUrl.test.ts b/src/auth/platformUrl.test.ts new file mode 100644 index 000000000..d06f7d9bd --- /dev/null +++ b/src/auth/platformUrl.test.ts @@ -0,0 +1,43 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import { DEFAULT_SSO_ROUTES } from '../utils/common'; +import platformUrl from './platformUrl'; + +describe('platformUrl', () => { + beforeAll(() => { + // @ts-ignore + delete window.location; + // @ts-ignore + window.location = {}; + }); + it('should pick default platform qa sso url if no extra config was setup', () => { + const ssourl = platformUrl(DEFAULT_SSO_ROUTES); + expect(ssourl).toBe('https://sso.qa.redhat.com/auth'); + }); + + it('should return dev sso url if env is set to console.dev', () => { + window.location.hostname = 'console.dev.redhat.com'; + const ssourl = platformUrl(DEFAULT_SSO_ROUTES); + expect(ssourl).toBe(DEFAULT_SSO_ROUTES.dev.sso); + // don't forget to reset the hostname for other tests + window.location.hostname = ''; + }); + + it('should return custom sso url if provided', () => { + const customSsoUrl = 'https://custom.sso.url'; + const ssourl = platformUrl(DEFAULT_SSO_ROUTES, customSsoUrl); + expect(ssourl).toBe(customSsoUrl); + }); + + // test for all envs using the DEFAULT_SSO_ROUTES + Object.entries(DEFAULT_SSO_ROUTES).forEach(([env, { url }]) => { + url.forEach((url) => { + it(`should return ${env} sso url if env is set to ${url}`, () => { + window.location.hostname = url; + const ssourl = platformUrl(DEFAULT_SSO_ROUTES); + expect(ssourl).toBe(DEFAULT_SSO_ROUTES[env as keyof typeof DEFAULT_SSO_ROUTES].sso); + // don't forget to reset the hostname for other tests + window.location.hostname = ''; + }); + }); + }); +}); diff --git a/src/auth/rbac.test.ts b/src/auth/rbac.test.ts new file mode 100644 index 000000000..923df58e6 --- /dev/null +++ b/src/auth/rbac.test.ts @@ -0,0 +1,21 @@ +import { AccessApi } from '@redhat-cloud-services/rbac-client'; +import rbac from './rbac'; + +describe('rbac', () => { + it('should initialize the rbac client', () => { + const client = rbac(); + expect(client instanceof AccessApi).toBe(true); + expect(client).toHaveProperty('basePath', '/api/rbac/v1'); + }); + + it('rbac client should use interceptor to extract the response data', async () => { + const client = rbac(); + // axios automatically wraps the response in an object with key `data` + // we have and interceptor that extracts the data from the response automatically + jest.spyOn(client, 'getPrincipalAccess').mockResolvedValue({ + foo: 'data', + } as any); + const unpackedResponse = await client.getPrincipalAccess('123'); + expect(unpackedResponse).toEqual({ foo: 'data' }); + }); +}); diff --git a/src/auth/setCookie.test.ts b/src/auth/setCookie.test.ts new file mode 100644 index 000000000..517d02485 --- /dev/null +++ b/src/auth/setCookie.test.ts @@ -0,0 +1,12 @@ +import { setCookie } from './setCookie'; + +describe('setCookie', () => { + // the time is set to 2 minutes and 3 seconds by the `expiresAt` parameter + const cookieRegex = /cs_jwt=token\+token\+token;.*;secure=true;expires=Thu, 01 Jan 1970 00:02:03 GMT/; + it('should set the cookie for various API pathnames', () => { + // console.log(Cookies); + // const cookiesSetSpy = jest.spyOn(Cookies, 'set'); + setCookie('token+token+token', 123); + expect(window.document.cookie).toMatch(cookieRegex); + }); +}); diff --git a/src/chrome/create-chrome.test.js b/src/chrome/create-chrome.test.js deleted file mode 100644 index 0f132b16d..000000000 --- a/src/chrome/create-chrome.test.js +++ /dev/null @@ -1,51 +0,0 @@ -import { initializeVisibilityFunctions } from '../utils/VisibilitySingleton'; -import { createChromeContext } from './create-chrome'; - -jest.mock('@scalprum/core', () => { - return { - __esModule: true, - initSharedScope: jest.fn(), - getSharedScope: jest.fn().mockReturnValue({}), - }; -}); - -jest.mock('../jwt/jwt'); -jest.mock('../auth/fetchPermissions'); - -describe('create chrome', () => { - let jwt; - beforeAll(() => { - initializeVisibilityFunctions({}); - }); - beforeEach(() => { - jwt = { - initPromise: new Promise((res) => setTimeout(() => res(), 200)), - jwt: { - getUserInfo: () => Promise.resolve({ foo: 'bar' }), - getEncodedToken: (x) => x, - }, - }; - }); - - it('should create chrome instance', () => { - const chrome = createChromeContext({ - libJwt: jwt, - store: {}, - getUser: () => Promise.resolve(), - }); - expect(chrome).toEqual(expect.any(Object)); - }); - - it('should postpone getUserPermissions resolve, after chrome cache is initialized', () => { - const promiseSpy = jest.fn(); - expect.assertions(1); - const { getUserPermissions } = createChromeContext({ - libJwt: jwt, - store: {}, - getUser: () => Promise.resolve(), - }); - return getUserPermissions(promiseSpy).then(() => { - expect(promiseSpy).toHaveBeenCalledWith('mocked-user-permissions'); - }); - }); -}); diff --git a/src/chrome/create-chrome.test.ts b/src/chrome/create-chrome.test.ts new file mode 100644 index 000000000..bc6faa432 --- /dev/null +++ b/src/chrome/create-chrome.test.ts @@ -0,0 +1,131 @@ +import { initializeVisibilityFunctions } from '../utils/VisibilitySingleton'; +import { createChromeContext } from './create-chrome'; +import { Store, createStore } from 'redux'; +import { ChromeUser } from '@redhat-cloud-services/types'; +import { ChromeAuthContextValue } from '../auth/ChromeAuthContext'; +import { AxiosResponse } from 'axios'; +import { OfflineTokenResponse } from '../auth/offline'; +import { AnalyticsBrowser } from '@segment/analytics-next'; +import QuickStartCatalog from '../components/QuickStart/QuickStartCatalog'; +import { ReduxState } from '../redux/store'; + +jest.mock('@scalprum/core', () => { + return { + __esModule: true, + initSharedScope: jest.fn(), + getSharedScope: jest.fn().mockReturnValue({}), + }; +}); + +jest.mock('../auth/fetchPermissions'); + +const mockUser: ChromeUser = { + entitlements: {}, + identity: { + org_id: '1234', + type: 'User', + account_number: '1234', + user: { + is_active: true, + is_org_admin: true, + is_internal: true, + locale: 'en_US', + username: 'test-user', + email: '', + first_name: 'John', + last_name: 'Doe', + }, + }, +}; + +describe('create chrome', () => { + const chromeAuthMock: ChromeAuthContextValue = { + doOffline() { + return Promise.resolve(); + }, + getOfflineToken() { + return Promise.resolve({ + data: { + access_token: 'string', + expires_in: 0, + id_token: 'string', + 'not-before-policy': 0, + refresh_expires_in: 0, + refresh_token: 'string', + scope: 'string', + session_state: 'string', + token_type: 'string', + }, + } as AxiosResponse); + }, + getToken() { + return Promise.resolve('string'); + }, + getUser() { + return Promise.resolve(mockUser); + }, + login() { + return Promise.resolve(); + }, + loginAllTabs() { + return; + }, + logout() { + return; + }, + logoutAllTabs() { + return; + }, + ready: true, + token: 'string', + tokenExpires: 0, + user: mockUser, + }; + + const chromeContextOptionsMock = { + store: createStore(() => ({})) as Store, + // getUser: () => Promise.resolve(mockUser), + chromeAuth: chromeAuthMock, + analytics: new AnalyticsBrowser(), + helpTopics: { + addHelpTopics: jest.fn(), + closeHelpTopic: jest.fn(), + disableTopics: jest.fn(), + enableTopics: jest.fn(), + setActiveTopic: jest.fn(), + }, + quickstartsAPI: { + Catalog: QuickStartCatalog, + set() { + return; + }, + toggle() { + return; + }, + version: 2, + }, + setPageMetadata: jest.fn(), + useGlobalFilter: jest.fn(), + }; + beforeAll(() => { + const mockAuthMethods = { + getUser: () => Promise.resolve(mockUser), + getToken: () => Promise.resolve('mocked-token'), + getUserPermissions: () => Promise.resolve([]), + }; + initializeVisibilityFunctions(mockAuthMethods); + }); + + it('should create chrome instance', () => { + const chrome = createChromeContext(chromeContextOptionsMock); + expect(chrome).toEqual(expect.any(Object)); + }); + + it('should postpone getUserPermissions resolve, after chrome cache is initialized', async () => { + const promiseSpy = jest.fn(); + expect.assertions(1); + const { getUserPermissions } = createChromeContext(chromeContextOptionsMock); + await getUserPermissions(promiseSpy as unknown as string); + expect(promiseSpy).toHaveBeenCalledWith('mocked-user-permissions'); + }); +}); diff --git a/src/components/Header/HeaderTests/UserToggle.test.js b/src/components/Header/HeaderTests/UserToggle.test.js index 95a2867e4..c6f511200 100644 --- a/src/components/Header/HeaderTests/UserToggle.test.js +++ b/src/components/Header/HeaderTests/UserToggle.test.js @@ -1,4 +1,3 @@ -/* eslint-disable camelcase */ import React from 'react'; import { render, screen } from '@testing-library/react'; import configureStore from 'redux-mock-store'; @@ -6,37 +5,30 @@ import UserToggle from '../UserToggle'; import { Provider } from 'react-redux'; import { MemoryRouter } from 'react-router-dom'; import { act } from 'react-dom/test-utils'; +import ChromeAuthContext from '../../../auth/ChromeAuthContext'; jest.mock('../UserIcon', () => () => ''); describe('UserToggle', () => { - let initialState; - let mockStore; - - beforeEach(() => { - mockStore = configureStore(); - initialState = { - chrome: { + const contextValueMock = { + user: { + identity: { + account_number: 'some accountNumber', user: { - identity: { - account_number: 'some accountNumber', - user: { - username: 'someUsername', - first_name: 'someFirstName', - last_name: 'someLastName', - is_org_admin: false, - }, - }, + username: 'someUsername', + first_name: 'someFirstName', + last_name: 'someLastName', }, }, - }; - }); + }, + }; it('should render correctly with isSmall false', async () => { - const store = mockStore(initialState); const { container } = render( - - + + + + ); @@ -47,36 +39,26 @@ describe('UserToggle', () => { }); it('should render correctly with isSmall true', () => { - const store = mockStore(initialState); const { container } = render( - + - + ); expect(container).toMatchSnapshot(); }); it('should render correctly as org admin', () => { - const store = mockStore({ - ...initialState, - chrome: { - ...initialState.chrome, - user: { - ...initialState.chrome.user, - identity: { - ...initialState.chrome.user.identity, - user: { - ...initialState.chrome.user.identity.user, - is_org_admin: true, - }, - }, - }, - }, - }); const { container } = render( - + - + ); expect(container).toMatchSnapshot(); }); diff --git a/src/components/RootApp/ScalprumRoot.test.js b/src/components/RootApp/ScalprumRoot.test.js index 02a82e08a..44fcdb7e1 100644 --- a/src/components/RootApp/ScalprumRoot.test.js +++ b/src/components/RootApp/ScalprumRoot.test.js @@ -45,13 +45,53 @@ window.ResizeObserver = })); import * as routerDom from 'react-router-dom'; -import LibtJWTContext from '../LibJWTContext'; import { initializeVisibilityFunctions } from '../../utils/VisibilitySingleton'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; describe('ScalprumRoot', () => { let initialState; let mockStore; let config; + const chromeContextMockValue = { + getToken() { + return Promise.resolve('a.a'); + }, + user: { + identity: { + account_number: '0', + type: 'User', + org_id: '123', + user: { + username: 'foo', + first_name: 'foo', + last_name: 'foo', + is_org_admin: false, + is_internal: false, + }, + }, + }, + getUser() { + return Promise.resolve({ + identity: { + account_number: '0', + type: 'User', + org_id: '123', + user: { + username: 'foo', + first_name: 'foo', + last_name: 'foo', + is_org_admin: false, + is_internal: false, + }, + }, + entitlements: { + insights: { + is_entitled: true, + }, + }, + }); + }, + }; const initialProps = { cookieElement: null, setCookieElement: () => undefined, @@ -134,21 +174,13 @@ describe('ScalprumRoot', () => { let getByLabelText; await act(async () => { const { getByLabelText: internalGetByLabelText } = await render( - Promise.resolve({}), - getEncodedToken: () => '', - }, - }} - > - + + - - + + ); getByLabelText = internalGetByLabelText; }); @@ -156,6 +188,7 @@ describe('ScalprumRoot', () => { }); it('should render GlobalFilter', async () => { + const fetchSpy = jest.spyOn(window, 'fetch').mockImplementationOnce(() => Promise.resolve({ ok: true, json: () => ({}) })); const useLocationSpy = jest.spyOn(routerDom, 'useLocation'); useLocationSpy.mockReturnValue({ pathname: '/insights', search: undefined, hash: undefined }); Object.defineProperty(window, 'location', { @@ -181,24 +214,17 @@ describe('ScalprumRoot', () => { }); const { container } = render( - Promise.resolve({}), - getEncodedToken: () => '', - }, - }} - > - + + - - + + ); await waitFor(() => expect(container.querySelector('#global-filter')).toBeTruthy()); useLocationSpy.mockRestore(); + fetchSpy.mockRestore(); }); }); diff --git a/src/components/RootApp/ScalprumRoot.tsx b/src/components/RootApp/ScalprumRoot.tsx index 4a1a5a2c9..ee781b68d 100644 --- a/src/components/RootApp/ScalprumRoot.tsx +++ b/src/components/RootApp/ScalprumRoot.tsx @@ -197,6 +197,7 @@ const ScalprumRoot = memo( return null; } + console.log({ scalprumProviderProps }) return ( /** * Once all applications are migrated to chrome 2: From 891ddaf9e267546166774239a018a969aafaf36b Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Thu, 23 Nov 2023 13:42:25 +0100 Subject: [PATCH 10/23] Add missing RHFULL scope handling --- src/components/RootApp/ScalprumRoot.tsx | 1 - src/hooks/useUserSSOScopes.ts | 8 +++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/RootApp/ScalprumRoot.tsx b/src/components/RootApp/ScalprumRoot.tsx index ee781b68d..4a1a5a2c9 100644 --- a/src/components/RootApp/ScalprumRoot.tsx +++ b/src/components/RootApp/ScalprumRoot.tsx @@ -197,7 +197,6 @@ const ScalprumRoot = memo( return null; } - console.log({ scalprumProviderProps }) return ( /** * Once all applications are migrated to chrome 2: diff --git a/src/hooks/useUserSSOScopes.ts b/src/hooks/useUserSSOScopes.ts index 13b82997a..e857786d8 100644 --- a/src/hooks/useUserSSOScopes.ts +++ b/src/hooks/useUserSSOScopes.ts @@ -26,12 +26,18 @@ const useUserSSOScopes = () => { const requiredScopes = activeModule?.config?.ssoScopes || []; const missingScope = requiredScopes.some((scope) => !currentScopes.includes(scope)); + const shouldReAuth = + // normal scenario for account that was not authenticated with required scopes + missingScope || + // scenario accounts that were redirected from sso and might not have completed required steps (like completing full profile registration) + (requiredScopes.length > 0 && !missingScope && document.referrer.match(/sso\.[a-z]+\.redhat\.com/)); + /** * FIXME: RHFULL scope (and all legacy scopes??) are not showing up in the token response, so we don't know if the scope was authenticated * Work with #forum-ciam and the `@ciam-s-client-integration-sre` to fix that * */ // if current login scope is not full profile and scope requires it, trigger full profile login` - if (missingScope) { + if (shouldReAuth) { login(Array.from(new Set([...requiredScopes, ...currentScopes]))); } }, [requiredScopes, activeModule?.fullProfile]); From 7d1c15fc22c9bffe66a41d8c4a3d0a70c7e4adc4 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Fri, 24 Nov 2023 09:58:44 +0100 Subject: [PATCH 11/23] Update cypress snapshot image size. --- ...nternal user and render component.snap.png | Bin 6450 -> 7533 bytes ...nder correctly with few nav items.snap.png | Bin 38557 -> 58484 bytes ...der correctly with many nav items.snap.png | Bin 38518 -> 68198 bytes ... with footer at the screen bottom.snap.png | Bin 38557 -> 58484 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/cypress/snapshots/cypress/component/ContextSwitcher/ContextSwitcher.cy.js/ContextSwithcer/ -- should fire cross account request for internal user and render component.snap.png b/cypress/snapshots/cypress/component/ContextSwitcher/ContextSwitcher.cy.js/ContextSwithcer/ -- should fire cross account request for internal user and render component.snap.png index 2dc7336400f986922d606e773ca6eaa328bc2670..51d9c14d402618163704ba1ee554de678ca390a9 100644 GIT binary patch delta 760 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 literal 38557 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 Sn8_9JQj$}bEqh=R@_zx|j>Dq> diff --git a/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render correctly with many nav items.snap.png b/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render correctly with many nav items.snap.png index 5941431cbbe458bafebe3c64b115353b553b9370..64e699b7a5187f8b69d7e05f91b20c05145c4ca5 100644 GIT binary patch literal 68198 zcmd43byQXD*EMV)NOws|gLF3-gmg-GDGdiikdp2OX;6{Q10o!eJfsK+h;(C&lQRGiBq(e~`u z6F1Sa^xX1ic2{9=!RpW23S#uHWw>6yi%@&@>@^+-!Sgs|+B=ajanEe=nd@waF)lti zBAGMK2CVuiN4kGMG;oHUeg;X1y}G}z_^e5tkUi}0$5VvWBk8{%-#9S;9zmz!sE3FD z??*hWC*bb^VMzugf1fY?akA?Ee~wssd*|-~_^h@6v$xRx`xcAOpH&!3I5r$=Z@P;; zE7odRIN4jUeE!^ZbCl<3dn&SP*j(oCbITE&MqhTj=wpAtE#z+9zKuw|xbXf}X3)u; z`_^;PZUz?oP@H%3UkjUb(=&1C)d@b#Z!S?s+ zV8g?udWm&)!s$XzeaVIDxu`Tgzwr%f9j$)6dt_;8c^@Y7_2Tl9nf^N0q{)|vlr%9b zEBfCxo6LMLQR2)i7MU}#RXfvHWz_>6ucJ6z{A_KamTP0AVg+1OSdxsD7xAALaSc2W zP+lh{O>}_ox~>i6q7|rQ(Q$A@R~0@hA&I^xK*!D=Rawd1+S+;-6EjyMPk~a*J&H}e zOkW_|Yg^>A<5UE4?%gNtGX1%&EoBuIoE6*QV&duP>BYsxf46I2QESXNIB`txBJ=EM ztLLld!S3PVlI_9X-kea=DfZgh+U6vJFkZ39z9Jx*LV9c7oN0MwsIV?oV0yZAZ_g~T zS2lXye0gzMV|c5BeqbU4dwQB39GukN8a-cBkZlfDC9|Kx>1zwPveP0_x7Fq!@1J;X z)r<&_bkg{J_u6Ub1b-3v@4q03>Zeqcl(3u{Pnjlao#g)AR!)<8_pMYO3)GQ>loZlx z>)!d@Ii&aH;YgTa1UNN&U&(kCW@=nwl6^HZ+LfXF!Z1M@nJ6)zbQBtz>E8zyp~K&z zo7db3?%h*BM{;{CCF_t0JKxXoIU=9&J?9X50N!+_(MPY&nfBkkhMhis^5k?j5SImW zh+o8glT7OBgkD5ydDfsMB`yx{flhf;MFp1?+_dGEeywBg95NIiLB=NZW_RA4E=z?| zCkgo|3E3j+Y-u~t!Qv;S?Iu_{Ix z85sr!20R*?*om$DwhF&XJL=b~v>=?uzIyU`dU|@)O*#4&&(4~D`0!zMyoOCMBYLOl zI=gnpH>0$a-Q2@#XC2!xcY%k!afBe8_U#J!`Ve9wdB zj~_qAWoP$6EBohz)u~v!ME1oCGTLXwrnu;|3?DJ1o@xJbsfwXtX4?=>BPX|{k_x$i z9d1pee0jM6V?8}RwLh~Z#0k9}i{VSWyTAY8Qy?0yIT>n=-N>@W`bdSUn;Sok_wG$P zQu8I$AMJCq3U|_(Ec!Cd9=1mqa)I@2k0jOn0Cr2OSS$Qli8kDRjF(9{J;;n~(xsDX zad~-upu$8dUpb@0uA(6XIcM4xNBcdEFEpHxS;Ktw$NP&lRlinltiI>7&Hh-F!f}zF zD_O5Rz$Xhn4UH-c#!DsYW_opTYCqGM#hmRC5G!?+icKN-Pj+f#pPZe+R9DW!UJMf9 z4)OCS6V^^BgW%=H3ar9FFM9m+DY3ZH&|>IL?f!7e1}i)J;tKcc-!Jq(z3`XQ&>$Ep zP+hUcBO`kXb_g98mswn#GWO?Bt)tB`q>hPC``SX(9?a*Np7! zMC0P(>RSOJsa2{QuaNw}g%u8md+&EM6A=^B!X&lJt64$=O=~ksXb0C8U-K#_DrX4J z%`Gjp8@-xpf1cyh@$OOJ?u(g52@r%>_xQsI0OELja-6!C(i7bIdu@o7LrN+K)1`ij z-RMh_(6mROD~E37jUoO$a9Pt0UPCo@I^I4$V|6a{jec)G(WLvJn4Hwu-N< zid+qCA7mmu4tj-b20q*gG5Z?}!==wMLaEmR{T|)`*PYJfSW7X)4^|N@#-yXr-``U6 z!)?<4d@+o9)BKRymp>h>n{y2acpM~mq1yXfP1lz@A|qk=^Z*Ikxv|DSJM=_bgYf*i z|BVeSj{5x1B25VN3x>kw@)VLi0K$gH#4KCy|I}1fCy|Sxd>@oD9H|HaM!t;($>sU+ z$~by%|M#Wun}lusw6Hesw@u!-lAs_jiNflqbR#1X=>QKukJ(S&HTFHVI{UqbtaDi) z6R;%$*Z+HCBo2#|9|^*25z;zq@adYI7#%+d!_|ZlQk7y_f4jLo6TA zslmFzb-A%_gH*x_>=^*T<4h~M*t@2POQ7IsFa&qF#1Ftx`|nbwoDZ%>mxjG<4i zy8FS=62(kj($Gs1WjOksV;mRkP#1v{Fy#n%z(K=McXdb$NqP2L6=o+Fi>|&tCQi;6 zfRB6@9azSGmoLA(+UWxf$K!bF6sk9!( z;2j)db?{r4JSy0>INr{3YplR*X=wq`j)iPChl6v2(&?tZzuTr8SBW;0a~>9Qw%_lH zkNV}tuO)L(_E_*KC=_?58xYf98yZdza;}xaKYnEJJ+7aba}#BaPfSFDB=FcMt9>z2 zP6eV#{QBZR{A4z8aut+wWxX+bL50-Rq~Lb*_oe!u?YsAvdJuKu8iXTNznIh57gJh$ zW@h|&r2@Bc(2y7yWL{_dxtJIyFU@HAloFAgr09Yas&!L_*iEo{Ph@{A+i;_g7cU>5 zyrN=mDYO|QCVt8`6Q3P&3k$;n0&aoOI{7`M3fE-^NSXfQhg##=I@`4Gxr0iMWOOGe zX2Q<1H_Xh;pk1R9bKhMrsYrPHRu+H=XG-KC0K*KY#<|&+z|0#?B?)nH%^;@#5dC<&-jrQ0>NmJ& z2a{2E*w20wl5iNyM^uyhgib2Aq?p9d%|3W=Uy3>ON&Qj$v)Sb@bq!J$jx)%lfquU0 z`h|-`6ADxbqr~9_-+sHu+C6%mj?T`M@+mL1^ogzIYMC6^i5e4WLPmz-FSrH2Ev3I1 z8Gyb}GcpgdkVksY5Qo~0Ghgnc^t2~~@_F0m{AkJW&Ye5#dR0MF^{+Hbv^h$(+46#e zf_A4~&A6QGnw1xv?=iEDs*cj}BOP=we}NXCz1N9USD!M&C;s1_eo8 zNojFDLL@z@d2ol$6TCOktOR z6cgXH$Wsso&?l<{NYc#yl8VM}!C%kTOOk|Pi+90Q<$p46c&$DTSY!+M^#6l_hE8`Z zy~+Crk1AYs_@o4V^_qtl7GDga#=tH|zh1(Z92W``uPqLc%in3wQFPiJ%*?==Pi%GY zD=Q5#FnXfN#ZoS7#88STDeU9WrSs0%`zG#~kiV3!0$?82^hOZxj#avePoc zFe4b}!`p>V&~msxbbM`2UHu${b{dzG*0!I<)5iIfHdZ5G+q6xL2Wy*1HjX~A?SxFW zt(=}Bwxi8n;Xbb!mOOr7I0i0ln^4NfQ=X_WBRN4*)22{-O=jLY2jNGOo*&DzkotXd zgt9+VNy!MO-tOL~+2>8vmE;Q=Jz^TJ1TF7OnLqxF zi1HC4-d)&+yRP~&gur+5ZxgQ(5h`Y>%5lFUz3$ZxtVg?uneN>jWuX&#DX`OUN?z}3 z_d{Y?MD!VE$3z7uSFZ=z%4Z>uiBqz`?Mh9a(T;cI6?5O^7o8F%Ev2LYR%=xlgJQY| z*v=6DSp9P$tD0B+j`!sFTaesXN<(e`e)(2xTcf6NytSl|Dejq|o+~?maDDFW?Y*m8 zWr?1amX`EXQPE%Bfz7Cbs#bYwJjcV!K5tg>}?Bkp)~oQ zc6Xf}-3~WK3Q7SQ^rj109K6cdV}TLPf!6E*%H7w8>xMC5VRt!mvI^58Qwh_QHp5s* z7{v-FY*66v$nXj>nVmYVtM-(zX?2D+X+ja+3%*mnn}-f5j1)U&lLlM*?>PLd7RKaKA> zPHu0d4!vDJ@sGgJ)!Q9gymda*Fs{-#ru{H{J=(t1+lHM7o)bSe62*LFViM4Fftl+k z^ah`cv-6iLr7Hhn?(D{reeJ7{n$NC!WfS{2x~D2Lv91h;ITy&??uB_@=+@)b! z@$h5TUVdd2%jfFa%vIIg%86{m_wIeGnFY-SA_5Ree1suq-^yZlqEfbaT5Id$_2CjZ zZ*Os2iQjm6dS%*v`wJ_%9wrFX4~) zal342bocc!xU|r$(j-c^b@51_-jF=zww4yQ>-@b^6GT*XP$e(#5q)Jra5sWlnwh4& z7(gZ{-m?1o_f`}DVF2{$PiLS>o+@^tWA|T=CJP1>PzjbgpFefF7MNj zo0KylyQQAlU*3Ds8R8JdS( zxSOx`XNuiFdU;^%G$ePSGhfH`Y@fQ0y{J#w#y-{a@bompMQ=euMQO2s7s3>PEQviY z?S^f2%e2d-K{s+TF>@6X8;i>bEzgS=ER43lO66-ErI^bkePSGV-mpl%w6O0?}1 zDyS1qO<7QR*D>}C7IYYQE(c`Y(G3lUauzmRZj^yTC8joJOs*vCdWO|U#|+wipr!$? zCm)PKTxW=eOT7pi+X-V}cjbuGpiFw37WWXQhT_nAiW?fJL1}4anKb{72+b3L zm|cj(UD>CtQby4WM`u`ad2}R3hu&k@^MMF0&x(m5j*{q6hV%We9Qeae!qUHla~OQC zwCW-GY(LhTUzAn2O88j!u8xtryC5j~^g!YxC@Ly)+xQg?BEgX#R2Hs=2G8y9&p^?!I@ZGd}p!+ik-77^L9)Qark-sMq7 zB_jIqbInq%JtC6_t2_^|evKwyAE3qbFZX7!mib*@1qB6FI?p`@#IQflZF@2e(4K>K zQjiLN$K6=V2r4H0ugrIBO@uRt1s4n79rch2@!FiO~$99iUxbh%F1d#Ru!DctO}!t zTHdD1Ehl+-d9&?F#2<2Vp@=`Rf@QrvqVlcSyvEdi_{;uzD$Ye{Z_cd(8e;!T^l&1j zudz%!`3VDO#>EAk%$zCL)|f5EJgMJeujB8jTp{}>Dhn9X%ySWFn2DBgWP!Uut~A=T$jzt)0SkCwAsY%a?a?;ThA@(<;-B zCIBrjqADvY%I(_+n3dQc0b&J&Dw3Neahv#K2m+nni)Kq=% z40XgoBjx+GG%s&j+1rt#!pwBtW0jr>LkPFGKRejJm4X>7mZ`G5yu7dL%sny~h%5Ot zmRbU$X&FLJ`JbQ@>xibP2CCgZVX-+HFGu5(1kS|;0i?57Gcu@8#w^k*BJjK1FzNpG z&3v-XC9|i$KNd7MSwMp~t_Py2 z^Ax0Y$8B8kH$d6VD+9C`>Ng=tfd0j=Qu0`dBeH|#-X~Doxu}r&v_HSO(O;*4QKQ+D z(x|tC9`4qdi&{TEF(%+gaVHa*CgbiXxaK6$FSnK%nrLKDwdNy-wp|?G`|DK}W$%<+ zd+0cxO?CX4qu@3D`CY`(J*}D+fJNHT>%)C_atg2yAB4-2f{MyA%*sig?jTs@w-sjYy=%0S6ZD`IX;?v`1xIOA{omcq67!R6`LILmW@Bcr=u<8<>#a})zzgJ83|Lq zNtIeD{<{BKPKb$9@D7?(4pdCsw<2uPGeuuUP$UQEv;;Lj{5)=NsBpKkYt6FS?8me< zJ({TKImU(J3^Zg)X}rN8ovHmU zT%dLn687KRyj`abfO@$0IDMmi3ue?_mpKS_GuFt%v(0a=$f;75)HuSLy8`ogT zdUE)uO88{fg!A;?-S|6Fl_fWxPAL^%;(wVqj!){l7X6Z)R}{S_^bR}O;o^zRJ?ZP1 z`u>E+K(22MQ=sl=C zKr@U>NN5daU}mm%nvql*vb;Fio4gCs96;NwAy6QIxU0a%$!QHejzvI7$XY@#7Xy?O zR6+aEhoCzLK*qqx7@w3R4FuVLe%S+^EBy7LEqFG_nGdDzo1-mOifK>mALCsvEOQqs z3%h%f#rqgDNeU(`rfJGMJNH`l#acDer`Mg3eYh8jZ;4x=oCBH_;#R+p-)RMD!>(Lh z$$m0X)=NZnNpca=P{{9pFJchBAxBrCY^2!r&SN>MF0{j4Y%X3sDwQuMC3n-%j#(vh z7VxOauF?yvzI&***|ZrXnM0X4NmDc?`1Lm3=3VeSdTgy4%;NM7qmWz6-kaKNM*iKL zq{OEt$o@>)#>aQcYYTFG)1mI0m`$78>&RXK%5%5XAO3eRNoL*a_g;*DV$Jd1M+ZIt zD3)!gLVU_hV}$T#og7PMTB6tEJ4Zrp2~AO79=OH{U|p?Dqp`AEzzmy zKyJCamP4Qi^pp6M6gi-nba!>VYa6ezBbW3R1{JY07q;{*ibg6Ma1J#D%nE`^uq6H9 zJ%Vl0CxNX2$;Uv(Fsq%g0h&0_Pv>%DCC!(=r+Iv`A4>p5bl|I}>jUl5E^t9EYg|Tfdbh*4L5FKS7Ep-F{Z|8Yyd~k*x`xmXbL-X;DH!?x#FvW zUv}n+DDvXneX;0|{R{H9GB1z=L>gJRnif5Ru)R?^jeCL<<4!<%4`86G$@G+>_-DCy&#mlv5KC^rYF(EBIg)$y=q7LsSKb;p0u%2R zq_np2D<>o*)On9FL`7LIrs{UIl`%5ig*trdiOA6tt@5I;(pNu9q&$HjAYg_^yBMFz z9V(MiRj3$lParGH2UB9VnEypUh~k+h&mOxaWAFWdk(U%JKZQPIG`=F9n+b)IoWV)| zyWROdUgbWYhy|HAG39qQPtQpsEor^sTgJ|aI);?UNOWH1bdfCk>an`FqVAhvO-)jH zV_WXP#jxy*p@O;@5STpA`zS%zJTsF6glmiHF-RiEzQ^C3`)X%;ab+bjKK>C%4swat z{J^L)-<@rNOesKXf8;AuL_|c4Hu^xw45%FRKn#skOeYdo>U*hP^{%kXJPL4OAR>mj zHc~-D4VH@*SR8`@$toI-?yYDxyngws+$a*97x2s|rF=7i+PmDB6`7MmL*siw3smHf zAnzcz!4FQa9tswq*MyUp(5jdffq^2)nQvxWjp);q(0<-0oMwUgx!>;i(sIk zX8T=v_8l%Js_qXeasiHXvR%JZs8`L@FL}=H>+1{D`#%|T%GhPK^s!T~yPc?#=g376 z7DG63vYI#G-F8Q~mS2AeeQn^-RO%C+#=-r0>1XZ$`l z!M<=a`jwT7GcNH%fol#Se<_Kq=3&_HF0&YFiO0jm!@zbx-WUopc<{`;>&F~m3yHvr z6!zU@p?>CArqHWjV>4QbPZD_t7kLB8y$h_cp5*xKjsf~mgud^|9GW=rYI{I~Lk3_c z4-jO(+%}-LAqF6wfRI^*+htxFw6=SY?Uo0sYy>(XQzfV|j*#_WKUo(Kp6n_K3_0)X z%i}sjPTyk90+l^5g#bI>swKq3Yd$SCZU6>dyXyQ?Mq0u2AYIP;!K0stMRW$+K5G?7 zW569sT+2U(I~4WFSXR&%NnCaV4f=eq>#BXeZvt4T z0MY1!gQFyT(jN|e{JJ&@rw6+AqBj=ObfF{K(%PDUgrvjgc&ZZ;G68ki-P@z3rS%65 znu7Q50l6qj5dvU#0+sZ1K9Xy7s$K}#ExB#)pM*ljH^>>}LcARH`%l1Vo#%0$efXAL zFF+2^SI9RL$pQAfI1Z(7^AZ`KHP+SD6|_nKVL%Afop0Ae>Z<3}>B{LY5|=en>S{06 z19CjP!9yOu*M}p)bVpyOW9@>=Z1YV{$Qla@38{iDDWKv~D*=Q#TpzXoDkX&LW7W?! z>42sTm52`?=sIGkdaC;+djOMd2Bx>l)2DaA%z`;^ynv?xL<|{cXKtL(K;VUgs8@LW z_!cDRR#wJ=+=qi04#B1A10D@)FEQ}KLth#k12u}!LcyKP#Rav)A?-zI>CSp3kyrL1+bMs!lYA6y#DdYMpNNqUY@#^R?weV z1_1y~^oW2y3bJ>=4sK4>rvNAf=9wq(<)AH9PUmk~05mYKvJx*A)N%;H0MP~^s?1Ub zq5%aJRYO;|3;0uHJmx5QHNX`b5KA4pP`~=zS5j^5;zo$X|Sp`UY*%N-~wiu zRBXVk4*-U8l2GI$YilL}+n?`%)AKYp#ejbH}k-m+o>2M~4~i0{t^jFn#<9qo;a92VC}W8o||*82NEJK=Df*L+*AnE?e z+OFiW+E=)kQm0{PU!><&Xx_B<1gr_RnBN>)Y$8J?K{i*Cy@A}Ye>^e6Z)+Fc+6?Rq zv;LP|T+q1KXrT+v1T6w)u?lCp%V!07672d&o`?f%?KQ$&}mx91~8A!=>`hGB5&Qgl`80P50p$sM#f+;3j((pVuI8N>BVn(RN~EI zP7N)M4PG~HBh5|Wx|O=@AbJ68fodMv9$>};9*0JDdf*o4g44cyF@b1D^iARb)8?av zrr))JZE;2z8ajZ=0Ok}G+S=RUpx2bWC#gCPT3MzFppk~* zdcMBjcaK+O52n3#1{%Cx0XL-!=r6!>O9DhA_AQ4&73h}~GQcPpph_PA<|MU)p$pwF zZmfVpT7W1rQ~EF$6qxMDEVs5TGc z8;e2^E0$65?QW;kRXpgy64KKZY=CR-5k)2TRwj~U?>k@rF8EYSHzUhrV`dITqw$V| zbRa+^L0wd|fjUkwTEcGdISTlPE;|j!RY2lW02vBKK9qfZB~xHM9JRYGXf$|ucn?8@ zK%*u=+kzZi@V?F$CoWL)2C$?DsFSQ9Js~Cx*lOkm;F=O3f}w#cs7exGlCYb$h2j5` za7%p9zz1vZoO7jHxB0Exfps;u&!9Q7n&RQRh?)n+#w1tm&0wemAQcb+{(b{?gNW}1 znH&z)d{;b@Qp6h!k%}*-a4<22fU>duWrGt`%XWm)&_@728NDIHwo3(Pd!01sSXhho zJB=0~W58e{==zi$O(pZ?F;gO+79@6kpwq82JV|FF-Op`r<%tY-vKO4LQ1e&f;_`(k zTU=@?+X4kl~|2L~ZW08uqC#|F&| zVA=p&03B8V2qK{FyyY_K0}MbF7%Tq%{#fL^K_FZ{CcJrb!+mSK zeG=gc2^`XZFnP|0Grt(Eq?NkZy$uOLK>h}@Nbpim$^t&%fq=Fb=~PeyVcv9azTFKd zjli=9?MF}WC%cgtz+Hzxj|>DTD1M=FJ&-B{K4-t*g8~J{Xf!l6!vR7F2oV1nBLw3x z)qwg!f`B+QTp>|5P$@j8Qvj7Lk)!qQZp)tv?U&R%`U|J}U=*(*; zfSC3M6Oc%MjNSbqFnUx2 z#3h(((M%z_m;3hY%KXMg57<#*Ff9excM_;~(9ocJJqVMwiHVFzR!&YPE-qYv6F~X| zEt-dy*8)BP!Q+PyZ-CLj<~is4FrGsSftJdNEheEfgDJ;iBGQGPCZOZ1=(1B*>(=Qr zDWyU}6F}+(+iLwX$V3HdMj*H*Xley0Z-3GtEX+^>6jK565dTT@2Ypk!PT0 z)lR<#^R2AvYHH1Z&hFj)=fwWbchLz8lYx0afM%-Vdnllp2s2c;lvS>T5sF&FoxhvU z>7QMl??Cc|jsfUOPe3&U!*7Yet@>Ln<$)LxrB*1hR6 z?GeO#5cYAF3`Y#DeGD2}V*t$`&_n?0(^*-`^x2*6FBxKjB>#GSbuLVa1K>^q@TfnY z7Jj_lADekm0Tj!wB`}Bxx`V+YP390R@&KE3Lr##DLu+l2;sAAz(G)^-FvNeGhS%sz z%kN$SaEUnmcPiew0h?Mp6#y3C3?R6{UbwRUBhZ5B@iYl9K{_cJ=;HsqtbI&yL5#qx z0!_`sMg3I1=Qz}0DtjJkOh7RN$?|7V4QlE@X9Xzr3FwUFRa9gb74-hO0{qipz%k-C z%s@SZMnxYlu2}y6aSZ?eY|=kT6NLW5#T5JgJ}TY+r<(_U$(>!1{JRSH_^dglG=9Rd zZ0g{q1nKg8=njQ{7nx2cG`YkSyi%AUHb{j3tWG)g|M@)%bQ&=~oqnSH`>yf(mf&R# z(b?#hlz_GP_e5E7fqm7T{D19+248=r<|b>*3%jWpr=|4K2ioshj#**|$umXbq#vE( z{+q2~Nod;AzBX8a24dKBmA(cF2Q?$DBgT;t*kW-RRWX~`PW1mS5UjeIZXc6y&<4-{ zaAID4ljYrg3$*efW;m*LYtw5@_G#k6(G%)PPBdmApNF2Br!jJ?dY)_t+MAs+V|V1- zmIgR`?_xT`eXjT=r;Vcief!Ci(n&1udqd3Dbb+~a=oQBJ7_Qw4%5*LR-pg%VOpLL1 zY%CFJcFzgm!s#k-`L5oQ$GVyU>$UBZcu_u#7?sBCYL$xlrLpnqx|8xo;ZoajHEv7bMG^1N>PmSaP*!R=B*5<9BxjX|;z zp#zVl(4jiR_Q~I+FIOclMzoZ(J4=T<|J_5@iqgs5)-@?V9fH)Ar3 z6^}K8%`BL&uKg?hnD3p5g^FKw0xn5`YpWIGI~dDLdOE~P_#=Kp@krbRs!2C* z(12wi8>d3MMU+oxztIZ3lqwif`FCeDvh@%H0x|i1mQ0#r*i4+se%*acd;;M?Cq+TQ zkMaZU*n{u*kwr~jc$Ww?FDP}mXG&2oc}J*NJ0I<;T(r{d)|b(y&|j2WpKKd~RGbxQfJoPVC)aoA(-TQSOxyfhABWl2+aRXF1~cd%t1#qtS3O#C})0QdG0_GdCf7 zq$Pb*>oV|=LvbFj<0p>U;0z}ZNH~KG$FNzd*nsN^O7!b zB7|@;QO!>4Bjjm3;$Jn z3Ul65lAOkF!4~~dW5H*ujnlmTZBBQ+)*C)AHmGvobQLr+k#fFMC|_9Y}gV=Gmf^q(*za z=w*lb;mfDIIft9Nn6AQ~ya;=A>{n7F{fftYP-5@co13Xve36}uVDr4G=uI;Zeds%!u5%^)9v=vrUrU9PL2_QyAlXVgOt0?X=PG4XFRyY>&g zx?FBH3cQ%Q^wkg5VQSXz3jgF#YV^f_N~HZl^C3vJmr}JOSREtJp7w>ix%O?Fw=K{Lx^|4g2f`EuxIsx>4f0R_mq7H1t;6fVcT?$>SsesgVZ{2 z*?Kr!drH&vPqp9kwdCs(dIvs!h|P`9vz_qui9hnI7_QGlUX#aOPs%oqPyc}$L(0Q@ zg7(76In4y#cNmW@Glh=m9@NitE}p+0y4aUR5#(QxBS*ujD_V407R24#o}d@`WJ=)Y zVTs{7vQ6*3YLX_ni&v6j?fRx?&39&JZRj&K>(I8v&o)xsMPeI$-5 z+ZPkfzK$gC#t++o>g`2n_As0bS0`v|$Ld9rg}`cXLO7BVDPT$(PVgdis_7#wssU`=!R3<#M!sh%?2-KEKR5rLi|X zzp^k5pPTmb!i#GPvFg#T_MJ$<8w-47#6jdRC9|g9Jeq`KWI(vRvWT>DI>^C&rM9`` zX4ZgsrAEk`(z~$rtjLm7bgzE>!9Aj#`N)bJide@nt3k{@#ELqlRtwM3&@Yrt938jj zh8)hFZ$2977^Izt#Vj+xPo@OyzjNh&;*Z0TFqofu8$2w7efg!hHp1lNC14 zPg$cbHkYbRyP`MA#FNCF*1CUWThuY_!){HTkHKB;xEA!9$~02kwcHKbJK-Sze(5T; zBz%sMAI0z5n~xr~_9ZAhqj3Jii$i|nY0DLqR~@(BF2-7}{t)~szNJ|#gF~&*c|oky z=j@ul`#zD}_0)E|$%U?Di!voAr)3>MNh)d0`{cO)!%ABok$P|6;2ynA(x>>nC-i!I zRcUsu?_ZpTF4o`llFT4cvLt-j?^rtoq7?{pHel=mQj9+Ww;ps@z8r=o-m;f=^*^}3 zQXO((E_L0cc+RU=p8x2DT`?l!;FQ)d*zROxGwV}*BX+z){b08_ElXEeNnPBes)p`) zI5z3C$6p4Rt5TDzr5O6#U4nBMD%n?WZa2KgrXhAj%AilwCOHR;z!PJuD5GMr+H<&y z-leAumL7i8pZa-sslzxv>B@;SQZUKc(1zR&z-01BddE7I$$Xx|p5XMg2?f)U?UTFp ztc&N|L*+WS0sA_<8-ZDMg&OdT-W?`9Fn;J$KGQYHVfE7)zTs!rRq;-{aW znTVEJuk3QM)k*ZdC;b}~@wF{s?KBG27_5i4rg<@{f2sY;yt>-07D-!FIwDfKb@zA$ zzN6HFkU>}Fvy%~aYsewq{_JKy5!SUqy4!840-CK^3?bLYdg|l_Jh;f3kh^Oz_jzvb7MyTrO;SLZPxpkJ4Bc4pwlt)+Y6KmWb!tJ%s7WZo1_^Rih6xWUZ zc2f=EaOmjw8#J9HIMPu~9yMxv9C3 zA2fAEWa879MNf>gj;8y<<0XH{nXlG?D6XlkH)Hl~ZC?T>@?TVTy5xfaJZ1WLpWdUS zkh1hz&ut12Y1YRXzrv$Iq*zrj$C;?3U%hv`ho>s$9c9O5XOh#tTxrdZiwLN+rV4L* zk0!&mystw2>?;vdzm?hB44PtdInm&TvjJ8Zm9~!D_$g_Xdnc_gyUvw@bwfP`R}EY5 z>(De$dXKs)F#dDIwjrcSb%rg~Xe?>oo+`I6c9W3Si4o_B8%b?)0R7!{D*8D1y^= zscO3e|7QXY?cvF1h0@^m6M;yk!B|(= zAxyPn(wvWLVzr+oG|0r8IlC+9)^K3+mYoc_lwoYW%_OAO7eUSkR)|;8m`Z-6%QS$# zp4VgFds%f`;r>i}uN>yv>ZTQb>)-4arvb`!MMeV&!Fr0>D}CkhL2~YkZ+WVp zo;j1$qC6f*u=zeUlSqyU{uVQb5?cFyBTJRf?}}_ZwP-Me=OAVGqN`jQHNAyWWh6cj zk?&1PE|aMPl)i)n0^ecalr`blmpft_0s4-F69+nESL86ZLjr=OgwL- z5z5Qe{^L2CUm^Y$*Ue!W74*Cx@vpA1(J^curL@q8IX!FXq>yZvA(lh6tNQ8&?f_{p zF!FCQdBWaXZZZ4gk=xx55g9)1c_=l}d1+Fer+WIX7G9W#BBT^Fj4Omc?SzqHwf7kc z@!wjPg;R*8<7Z{4y_&RFoqlR#DHU>TD<9TGF4Z&ahSmaV&``cW}i*chdH7G4h77_po+|BjR^7*1!?3~2i;fr8d z@#@lTPPm9yGDXMaoy<)3BGlZbR2WF=R?^+2)k!n+8(>PXmgwz(6-mZWT(?mwy4z5KnD>Qe33X=@#o`F$O>c&iRY_!D#B6E9xj zj0D+~p^rm&#d=>RyBRyqC@(zjtR&RV3s_qjbw&%hS^g+&JUJ(Cc@~lD%v@q(qH68J zC@{HLq2JXy*!UaaiDDFRv8zp_S!Y2nLrkfY`88_zHY&c9<1JrfQsQ>8F~il_r(`Qy zaC(2lH1+TEt^3v+RJteb~;pN;}cZD+B>NwTidCk_|bF7vr zYwaTE$dJ+7o*9^N@$5iXcRWQ>DE6IV9KKUgU@H}?w|yCkeQ8!x++c zc?=V>)LhR~K(DVl8r-Z6JVD;@i}EO9neHC1CFnl>D+CP~g3%c7sGN6J8}6Im$6}ru zy%_sKCFc71z@o-}DhAxQuBLNOW=6@mc24WS_nE@n#ooW=Da?=sI9uSDK2Aqt2 z^V`C&lbGPO8ef-l{yyhokPJWG^}$4ANY$3zU$yL%k@r7J9i3#)KcflI5hv`o|0;NN z^VL{?UnDH7|9^HsSQsujnEd(s+Kra7eeS*(^mLMz9W&YgQ3qB2XK%7Pv&!p>0rX?P z+#b9lOyEvm%clJOzYugUk^lEE^Z&DVi2CUdY%~1J40l6wZZ*;vDhUPcBSGMYMEqw< zE<9w{n|I&8+Fzx|)l4x?J$*H8{OPYs3g!v(6jK~27sw0*o#s=%J*2ApG?({N0L*j! zQ=P$A&bK`kbph`>qHQKmcsZLcFno)!e)?D7_{bQQ6c+w-yD(&yn%j6f5HWwUCvWFU zju)+b(XAob+dW4R=>Nreb5*^ns`fui4CCQ%*jKo?eIe2!)tr;BTwyuW$aRv(qk;B- zjcqJFE%@)rcX9QCA&nPM_K+vsZ{0Bo=Y+(zo^9m_R?;QkFH*r{{GgRtkr23i!hkPn<5%l!PsU=J6w)= z1N>Bpj1y)}^o?t>A?kIx4O2cxJ5eWbzHpH>m1gPlc)m2j2N4g8lSnIlTO!4C;zC81 z)vd*cb4aXh4{7&N_>lf9XZQLBNcE z-Hf`qto<9|$HEanTFEljJ%1v6D2xa+ZU6@fmnV+~` zFAf)cTf06H&D4r~_hi&w_R^66rZ zu!F%ZA^5MGH}QpdxG^TB4|X*hDkViyy#}-J@Os}|kxWwmjoObS$;MnZHW`RUO)TYf zUE!1j0<;|O%sw!CdCH>zoXDRIP0z2sj-X>==INWw8T(3EvooUMsEuHC;aaarg-FJX zkX^T;+EeceALt&oYE5??#npR=)LVpd|9G5y<8|B28!=CGR%+YPYQ2o@Md9bvk=dD% zHOEg;^-uI~mXJ6#KdQNL7PTJgb#-l_^5yofsp6HNcn(3!u34Ed7z8~p)Yes+W!LTe z&?YXf#Yad&EF=8}J#(y7zY2%qFZ{s-!O&Ztb3b*X;#~GE$mLX3ht1x|-M*C2E{Se! zZJ0bb9{~H)d}{g;$A0ot+6FKcP3wZbIR9Sd(a;pyKd_`L4G!L)@*FLac|=eGljD2m z#}Y|kK}K!2&`@73QnD|x$ytkskCCK_>>as%1H`?M?p;`bdGqa~)Vvb%Y_FuP0B;!r~aA6Qi!L-*IaG5odFBkM&q;_kI%&b!j~n%Jg`I=^)&NiDHM@lFwaN z$~-*x<+cVBk+XYC*$ezt)8uIVQTTWdyxb?sU}d~e`O&@-wMw>p&6`5GwCi6MScYQh z$FLN>E!-Xv&if$+GoJC`4H}-pWB&>EpPcva$L-A1;5{@Fao)YZl5z92g)-b#&w{+S zRBGyBA-dAdGP2!*qDexB59t$)=k`Zfe2XxQ`G6L1jkG z=Qy@=X1ygnJh&NsL3L_MZ@LE~Zte-;DJ1{MAQQ`{!N2*F+kea`X5we&O$*r{52flT!X#I&>>|voy`YkboUSrYh>wzVYPkPDa$*FXsSdx3qFv0RR8zg7=Q|MpHsvfhqrO<8>`g=?zt&iozT z_-ktC|1ENZ3F&|Tz^tG~sXfi#+u6bG_`_7PHKjj;f7IXZMVx#FKVriW&OM;a;jce) zQj0Hq->l$c`1ohF|8kEh5`27q-1C>N`uw?2)BS(({ePeAzdtZ24L=^hYmXDE@VeBW z2aeeI-3ucE)Ya)yt@bJn1xs#EZ$R^q#-zFumxeW@ujS(j z*k33(Vo$1;Cu#ov%}XY#H15|ok!H2P76qQIquxhwKxuy898Tl>t#(h+k~^dG^t4A- ze^*q0P|@tYc_X`O2x8UHS})qDK?u-Lcbx{+Qx_S?mY;_LOvYW^<6B5DVk zBBKAcw2sl_Sq25Qn)3NK9dUSK|5V#AYmO&X`*$hGnmE%>Os8AN>o>6*-Qj0FoVsgF zZLFkQ5RrIr)nLVq$YNVs_UDy5$k#mY(Rm=+%$q{^t5NH6I^@hk46n>6AMk z8p2B~E|w_8j~a0Wp`Oj1ZxY@l*=~@)Gi7N`h-r}Nu4wsi7FRcQe?ojwxljb1AM-8gE6ha2#Ki?x@jLS?WfKj`F7Q z%To|+TU~yLmN+)-FtpYbY~n&SCe4imG@U@b!*ky8ua>7AX>a3}2i8O_RwOM=aiO=z z7d#~|n4ZCulCKN=n{(}4r6LX&aN{A=4$)h4P?9G7P4bca(VFdTUOuZV*QvX-X>$)L zNII<)It`l~#9B)|D1!*>OBp>ef9b@@6LFt)#eIX3Df@V75+x`d{437K=)0(*q!GT? zhOGUr`kjlB6AAJQzvF|iN3~hs{Jz#honFa(?YvOaEevH@G>JxhzNNe81(&IBxN>bQ zbW&5&M)M|<%dJ?_o#_qZ@EUhapW8C9OpPok$otWn>F8y0yWl8F?f`ql`TafQ-mW3f zi_m4O+{okS-Z)Zhk|=4b1N=-wZTKtJhgn#3uOHpQ8Xjf-Z$diYsCkgqNwA zOk`|X{hH(7>*?vbUz}@|QCpdn#18R_`bM5(cO2O+UBGWU+~=~gW>;aj)Hu8|Kd|~B z`LmD9i2Mis0^(JP1Tu$O`*|32^Bu{ZWM;;<8}1oQ3-ArD{Z5HwgL%7wgzz&~$n|Ee z`MF>(U0Mr=YkZa?S+4VUX)_*|Sh#yJJz{v=R=+K$|M1Lb%mzz8`;4ToCGBG+ozLUs z{Om3w#03A%bbN3UAU9DeIxTQ!LPjz{*K-<&H*91!%Whuz|XXu++sms6g zcc5?n%ijj~Ryh&&!=v;kh=VSN5 zl89!uPw&9d8e7(=_ZEhT&$k)BN&4H8YPsS*`e!V$SUI{WnhRCa?JXSXV|r8?niTZA zswMD@QkUcTwQ3b<1taB_&e)+jykgelSt;{pn~CoI9h$G3SD3n;a@1NlK35^ch>xLs z({J^lI>W&N?eltC_xz%At>D3m7e|pQ*PECJsjeZqUDemAn5=Gh(+T`rkrRfq`s;=p zeKQ4%2VDlJN$KRa9ku@W^)TvXj&g=#;|))Jp22Y| zAMy>h9~XrjG&>tdry z!QfRM_)k^mz|y^Z9=VM2z}p0O9v$~q{Fc8}dR^{a<>}eM%+RRy-K~p*IqqS+L$eM( zIrxt#Ew6mrhf8o_MDE6O+CMMpd?MfT3FlE5*-6w@1%5X_h)YbP|JdNPYw#U2pUb6r z_3`YE9Zu|e>E{>EEb2@x}%Q^UO6ANny4w`HO}G^_3`h@pRWjS=9T4L>pM;-+z}O7hI8~P>7E@U zf|0_{9|cm{4UyPpaFn*267ipDzZC58gMB$L2aCV)dcl>80R@@#t;#rh4o(lJSB+; zLp}Cz&`bV4nt(mj)TFijOa4qp*7BdWMr;%LHeu&jzjSDh2nOgR)?>(IuC5b0+eK5< zwReA;@_zTo8EPtGrL_fpwkx^QN7dl*!RRB!)8r2FjZ5-mAGMvsvCLeeFeDtlDRIWH zjXtoq)@e!g(OiCcU38x~J@Q`2vvINScW)66-sYoIATSW1)gvtnA9$$NFd-PJSw)0b zKU?^2p9vGd3ZUpbaN(2=ke&;n zlk6AxCVl7k+m008B(u^(lEm+`KP|Id?Qe}u#CK(h7!e+e@=%!LBlp%ecx`nia)m0VT#gynvZLHbSGb|hYL6nbQ3qQ&y`a8D3Z~cVdbo8n^WN6 zI+Kr72#8#9dvx)W+yi7PtgR%WFiG|EeZIyXMaODX8F`(V>*%4iLq*e}0t;Q|e2t#W zLS=LF+N)2*1~Z9D^W!h7v9~-!FxO{FJW9*$?ER=3-Irhc(L}BOgT(!`ml4>Fmg!9t zM29X&^|l2^s9n^Vgq26?^l@DjyPZ$`nc^grCfiJd>=j9Zm3JWq_uW~~Dn{D+ZOsfm zCR>?E4)wp@F77{!+41nL+Ci_Byb({iourR`orG0edlH^0n0?JzL&n(ED0|6duR!*3 zMbvKhVRY2p$l^8+bas5ltk3GM=*^-V}r3)L-rxN zqh*)0hRyU_e`z5Y7`{$^3La0Kb!kji-;2x?p64icazM67N z@?+n7S$xi;LSnt$gpIy!CAk|j8|#>%vz%U{CK_N$EEcvzWu}=@aN9mN{8Q$lC39hZ z&Tl;JjvWkNJbY5Qp^^t%6}uOXna>9^m%8;`E6naLCg+b+a5cZJvGHkGX3ROn_yrTC zcwx{R$psa(AuwJ?qayZZ4s2CuidY?Wq&1YQtCdbKsb2p<_@?5xCh4Mr(=&#s<(Z8B zctTW`TE+9gV-nHpG93K%emysx_-7n;TicY<`<5b}IKK}G+^81=uda?jt(L-!J$9zv zlfakbe_hoV?XD-5Z2)Y$_Xq|MhF)GytGO5L>LdAiR^5iDsiM-kQpFy-Qe2Xhzt-&V zm7+NsFYa6648G|b2D=HbZKlCi=a!yCLbD<_h{T; zly-+&_Sukjy=S2uSa7E|TAKEXQ2a5E+@0K)Kkf2-coo0joBBO_tA8>C;yM#;s9$NQ zx5igwi}7WZ+dXzF*qm7+aaHhA$FM!ms^gBT(fH`3_+##}^(`0?^TX{$3RkCXX2~nu z^IS-6K8?v`#zt0H-w)c(|Ln}F!CUC~NN%Qjo1HVGs3N)(ru~c3iHHAWQ^m9QMS}ly z@f$Q^UDjLkQn5FFC>iK1Yu|dWfAQ@TPLZ<}%w}!cFKv~=HCiIxOZ`x)*PeYXK~*Pq zz@Hfv+=%VMdW_e+%RQB#!fbl=CoYE7&$f0GoqIGaOSJRVi*ws=_wAKEJYQT8mWgXV z$l{P+Ezp$P2$$fR#CvK%dGB5HB(vVPeQf^k*J@YFeIBHkYYXd?2R9su-4S|`aIgQ9 zlFW<48jXjdwb@Ctv%lUAEHzm(H(3Oy+m%!Nw)vU*wRSYb@|Galz+1C@3eBN`7ObPr zgUlq6&hp=HywH_z(GOPyjw*iOn&Pb#Ah4db@Z`EQebIk7(g~Bzz-;ivM{)yyJE8X4;S2i ze(V>bcc&zx>6dFybzYD;h68VY<|^KUu=HPUwpvP5bUVBo3;UUAsf7dw3AS?IOx67{ z@O6LN=hCNG2|QJN^f0hJq3d8sGx+MEK=!4{v?f(N%PeYQw)4Jyf=4)5RLVb`~c57 zjO@kR@8m|c%RFMwFKN^Tb&wT>o8`zh3jX3A6gX>&FW}?mI^w(-hTXdPptu8-t;;}| z97r`)s*Uz7*5L)Rdd6`JAImCu&bmkIRV6?H|>=O9G!tUYR$}UXHQTl#WQPshGLy)@w+ z!T7Dwp61IfHtPv-YX;>P0YAuP96h=^t7)qDtDW@|ukJQQ=<`&ShBt`vJ`mlL6j)@h zxOC|~eor=?SmjV}i86KVB|b47m;;-aG^!e8u)Ybiq}e!ApPA})#9k<2MUf)ofyC@< zHrZJAl;oPlVC2L4GCSpS^5(>H#p5`A<7zEl>o|88dB#1eX~Hhr+&d?a`KCGCIl-R$ zQ~hCPcV<~_t>w786;0`t$+m9YZ?&dn-06NER5B_njrTtLX*#rDyZDPh;+(u)!`-I+ z_8kQkEN$~V8zGs&ueJ|q-qREx=?Gr)4nfUM2X$g~=u{?Nhz&VrQJDG4K86Vk4$n^) zHD!}6wO!qL;;pNuP81Ft*8{4+tl&qlj)f9>MlG{Y**Em~H9DT3d9Ib>{JXJF&d%Bdi^m#mS?mvomGbl4-WwR38_2}9%_{TA&&Zmz zjp63MKcG#o_#FECnAz}tRuVsMu(3puzd5Z8SJF4h{&9U|n`f3d<1YOak$IG7YgPR~ z?uv1&_e_Gs=hy6Cm^Aydu$rTnX-uwjhYs(I-VK37Mm^=KFD*4G zU*gm9z`o``dUqQy)WOi|<^r3@tLRM&r|DF6LVdqWCU+j;ZSqH7SAAL%-Fr@BQt~rF z-;nW4S{pvGJaO|bIydDrbuLWGG98`U=QlWe!Y3{U(iLS!^bg>^`4*mt$!m}L$QE`} z-e~G8P6Qh7Ya)s4GWM8xiO`R>Q4eZ&djghRon}6qch~U1&MTg{tBT#MJnPZoDv)7@ zH}3b{*6W8-P*d-3({BM+abA+Uci!ugBpX?HcVDQ^Eo^d`MUQLp;wH0Wa9GAiU-gof zBl>d~UlMve9-p*gR~TdYXl>6D*~3l?IfFwA*3+0#v5~tK!8fQVps;K)`gMz2-u_jQ zF8Mhk+XPYv{v-p2?Lw_Kr(4b;XRLH)xVkRMmJ5ZNp=u+#$ii^vLYgyu{iB*~QiU?s z!`FA@3Kt$xC{l#I6*AFt3(@#iCGm?q%VU=ICZD&#IR}c78glam>6H81p{PhYJMv#A z#;Cib`FQyHw2f2eZP@QM_T=&NZ8+tJnTMECm`(XGe$xs$jv=^3ucun&otUWpdbmxP zwHe*lr!Ou?O=Pa%La4>pOtK-K*H1UazW2UEPmEbp7XqauL?&e8QvG zD+TW0pw}L!zwqjD)MfaRuA;R6_OMvQVreP8-$sM^+rcN-lEHP2A}^sWE$-@%#^!^v z7U_q*MGS+NH*n2gWQI@Dw5ee@)r{HMR`=xfdfEqbwxw7 zx4vzS8mAN`bG&)kCR)sS0^{fEC7R}lJN9QUyVmIZcG708NO(xfVu|{A@u!M65zSMo zesrU`JFllSf5B;>>25ZXzRT`}4icwe^gT=bo| zGFuY1*UMBz%Q*IrMTt}|I^j33kqlp~dVlh}zLxLF^#PB(V@Q8@T)Y2c-^)bgi+jl@ za@RDNA{OXQj;TcywB7jZk6l#$+~{D^MDnN3?&V_}8oC<+Lo?`_C?=g<$_lQR@7imYhvBs&mhVXo z8gu?PH09O!XZaLcO5c<1wr>$&mbk1mW;o+wZ~34RXkk&)QTM)+WZnC{B(G1tz{jY< zc#MzZ5LNbaY<6L;VDqj0t%EOUxw>!)-0=yOgYH>jVb$gly`}NkM_UihI}2gFufInw zcMxUm8N1E1@~&{yTjT-m;MOpqrsJ>i6pAS}oyjK~cF*dw#`gO-Ln9aLl^eyz_0$<-DzIy z+3Lq#jEqjXA~hy2b}BJe-EbeAw{$%g%B5vD?FiA_zC>*2e&}BI>&iUK*mGW4&btTW zH#}D;+nzdD=c?z~i}T^pUTj#4|LRe(TPHgB6Wc!O4)^%FdBvRD$bIayXX?oHiof#H zO#P!Lf0s}8pWOdi8s>LonG(X|Y-nv`KaX2vq~p3De~;)*;!EKC9uX1xu+ZPu`MSW< z*#6IgEqYt>j?%LtVBamLC^_EMDfSbES)W{!nX7&&6mtgK=ZrTi;m$xe{&}AINleD1 zYP)O4haq;4qCCVGtHgfh&@U);Q$qJyJ^zE!HsDh`kv{c7_!2AIj{2^nP*BWr4cYmu zq!QbXInA%ENrwJ+wLZnZ^l%#~o6=ej!oisZ&T5c;BogV&F`wX zH3PrC`simN{|MXgH|CV$Zrs77e#}_+mae=_rnfk#0s=YAe*#>q*>qQrtyR z(FCGxO{3pxW6Yyo@O|`%f*0<;Ktt17?=q>bspW(i1kIocSP7;`ut7)~*Qcwodq+1?=fH zk)yMT2PoyLF@ce8{8lYZXx6eZ%Ud7j*@hZNpElFq?r(TWRVtv?I=0wKXeD3FoyoUJQG=W57UXnvlp$Rzt7tbgt8l$UaXhABZ+usg7SS8TyUNhY(h3)HSG9|X zlpP-5*V!B1xhcuYp~T0O>xMz2ha8& zZMnB3sy#8cfNkEcc3fOczZ2CT)%D(HtM2|=v5M_F!ST_#jL`YIN0x3Or83)iuOA8$ zhql($;#XPatPWJb;jex+=FD%^u^b})YFcZLcQsL+lL0rb%xTLfKi6Bep=fKXN0|i% zJ`G*XH7Jga8TjR-gg;p_ZFyc2Et7uR-uy$WPMMEW`vLjK<^G%69@bbIhvdfBZLvmL z$@M~-_2zO{tCFGy`p$|N8F^N<+#lripH6)!WMsoM>w9T#z&`jktH99~@AyW~S#RNq ziYS)z{w{-+9UCtD@8=$SzTAk}m}f!U8P11(MvkHKdpto{wD~QtsU)xor_x{Kn3rgJ!p>)TT;8Em z=AF+bc>L{b*~RbOui=Zo{UXs5xk97ivVEB3yc66T_%o=Cuz7(%Q~ELgoqvXp!(2K( zeU~9FzdP)O$;&4ffke@m5T>kg< zuwn-6A*HRRf{srmQTXTj;Swxo+=nV95l+SBYySM%XsQG%IC%eT9UD+MFz)p=TH|e9 ze-WG)+@0$nS|Ok&?8N&~sjQ!qhTB``;F)}npW&G4vmODIS~GHFy}U`-qjoI%+WO3vPt|7uerK( z&tWlFsG`i8)$;?xw`7HpE%&M#sp&c_UVEbtcOC31CBu{QBe~}`@v_qlWrS(Sdug69 z(WP1}W4c=E+?D=kwR~i+Dv|0{?t=XufkVmehf2ZEj&yJ@7cX?06$dUi!L2(qM{LY5 zmxNyYj7rL4$nm$Oq0v}pmB3W|RFq>$kR}e|#$4M)r=hLyd;DsL4Q!cVXel^R^(mc{9VT4VSk6eMJR| zFghUtD!XMNYhYPTVTum_>d3xU(-qQd0dsu%Nt5F>gWj85`CH_zR}Ka6WMn$1wb*?0 z&fV6-M$g0=z{4Eq*KN>$@-$6mh~jD)pAm{gq#DUUoZvZ-1x8(9nyD zPs8>LAM5sICQqe(Aa>({f;WCprI?AUk#@rlS@x6$F<;=@_{WT`#D?tdk6CYj=I!ml zyGd?+gZx8AZLaQ0xM)s?W_G0>IaS%`8EpMuzbSgoxz$K2D_?s4K3l=$E5`e+eW*};>wre{l{>M*VkA#G(IlE< zSI4cd>)v#k#LRys=iYUrs{M{1?sxJ12Y6nu{qDR@K3^{?+PrM2&6SWycabLhyT{hf znaH5KrH9g????%YhYWyQz0Gr7qL=euwhn!6dIC z8#eAi1p_XfnQX(X&}G9|ejuDu%=B`gIP$uf8TNG+7t}&A+H+@?WOv?~a@){b3!QWe z`Az2@bCy~)Juz&8>Bs*5>GTuOQu=P|pZ!Wmr6TeCp<^*{!oMOvRv)qrsXi9}s#lf7 zKKS{#C_zgPryygSh7=MFC6hlVEv#B(j@pWyEp&uz)Mgf6jfV_eCJy9zzZtEhQs@uy zwLX}O<^5>^t3Nkh2oxqZiE_611qzS5QQQ1}<2y?P)=%6=4&L`t^BT`o49ljY?`T5NXNvZwjv*R1KK8!)^#2F7B zxXVdP4VKeqhZgDbaeQ(&3afg0aeS!1p^F`U} zIdi`!AE)Y_f>sBp>?LG(YYneP$HqFOf(6&#mK-!n4MAfj9X%H5C$*fDU!>qjkoF-2@e+V$!AGbl`IEJ|l6#)0ME4I8=W$Y(X)CJ95E`_c_IGj;96RuI(KW4)(NKi83&vy|Z<4V% zt;bu&tn3M+Z8%S+wle)blN}-JvP0+2n?WZpb7g-pXL7rGk2{Ch{~ylSgKjdx_=s@mQ`*= z(ddq)%A@4z$r{PhdSiqjEp_!;a^ePk_uRgzVOMhFhm3qRp-pv)4qQ7X1v@Mq-7_!l zzBoM(B|i-QwBlM?*OZl&`I6+jls7jwqhewdA3m%F2lqB`&02M>e59hHUoaviD@zT2 zwqU=Ez%wl^nPB|%w!OZDj(t=UY?AM?mZz3gx<^;BJjF>FN`#h@IFu6C6uf!w5r09+ z(bNRnLSEvCUA-U?3&ZSSAR);?gJqGek3k0-3r!d)qmX-M&xQ1hTF;l}U1rBheFIgG z{6vpBBRbD*m~aXn^NxBvp>X@&`tDdLQgXiA@1s}U5{0lqQ+!0wMypxyaXhZ%pkcDt z7B5q4*G#EDEoXX-Kh=_Uve#3du*;!FZT8oj7v?wpjqO@>Og3gc&}H3IpW!jv8gA4a zlxof$VdIYSBy}pAU98@q6WkdP)SM^}kFFIRnT%rfY%ZMZx#G>kO!o2HRbixo_eE;SCdwfoXw`9Y49+?V}>uL$M^Py_L zvu;R`#tMahQ1|8PhOp&?);fLpXF)O)N9VQ$V(qu7EU-?>zP_odqSAEzcn2CHMFC8Y zYjwj3=QdsAMZAP!YZuY{{986T&zZN0fe(R7OF(p=*pjw79aXCQ=UYWR8f8Xo5Cq!Ij;c5ASQMW z{?nFE)&a2s=H`xmehvf5L?Cyu>-_cw3TOIQny^merkHr=9TfjIvEarASBzX`p!6;U zTZUchSOKX#;dPtpl9+u6SnXOLhwa+YT(7XqEsM%)d`VCXu3ESzTG$}Fgqb(j8ZVf{ z874_V(azj1R*1vtU42|F$Y17zv7FF&_2j)v0`#XV$_=rj<<9e%ayUXo~dOb>B3l$>8+67UUAm{R%iAzm$_G90q zIHJ#EN2rVd!9Ccr3D$$AWOiWC>S-QdpS;}%&WG)V{LbYI&2qRUFr?9UlS zSgyuvsmYdc#yTc2>Q229^&1sRTuO3*1Gn|9n0_z9QMIcViL;Zoy49T&69+8?b=~xZ&g!Xn0dGOiAz5vw(-KpY+wUw27-OZU}&AZ(oz4qw<8{0a*^UzD9{qV}iIJ-ti z?d>aU3)!vC%jL1xh00&>%fBC1s`=KP^ZI53sqq_{Wtsx#8@%2o_B$xn6bzfhrl=Gc ze7pV9#b_g{an1coD|4kU@IpGWnf!3OZhq(3xNjHmHqK$UH@G)VK(9+fBVNowx#Dmp zLRO99Br%(H|59wD1HOnbY-qW;xxp?0Dbd~kWm+7eQ~=PA`}gmc%qLj1babSB7Fuf{ z9Qg8u-RdhBz;Al>YhR$lOw@+1bWZb-vDm6bW&%wAN*dv_OP~Cko^_{oX#>TeoiQR3Gn) zs3U%(R*PR$b>^HwK1C4h8E@0m{SdA*f)R&rasYp4cHn_9WK8$G5o1y>4EXTjRzgEl zlReNj`hY}*G+o4LR&GXUTtJ%GDNz^{7PcS`9To9OR$m7j-ds4jdNTsES-sj*C_>67 z@(I}CYdcS&fB5jh6jFr}u#sN`7!XqSwm)ST2N)mXr_UdW*tAPaV-0CKTmr&lVG%-; zDl5AU#=+ppIco@Y`~VEj!Kav>nfYBWyw!_1#g_W{oe#}$SmLaGUw* z(>rN!sxA3d^iAsi{gbvLMUwx3fWmxTwidv}41g7+FJ*!h_!C3;q!-1tfQX5GpB5r^bqnWAcq|WgkF?f!m zojs%8*V9vz2V~&{i|i@c)%`=@aP(92@Wdoqmj#}Fvh$=iYiuF{n5m#@8pw6!XB_k1ZW&?ZoG0L+#>cj~W0msTju`}WIyZ!rTV6Zr->izlt1&^)u&^T+zh z0(vhOnBam>#H_o)>6+6-_Q@0OkONN2j(PqrZF;_|pc;s;Wwl9*LWq z-+~%Xmj;7fzQi9(OJ;q*Jci2c;{8)YbS=gOdIckVgYb|@CILx>1i0b?>*1BdT^R0W z(5;}j{1YT6%^QI7`}$Q~+hy*`i`pA<092|0*Fb*aQP-tUNJV!49pY$0$e1UwFEV!`n&pJb1g^wH@c*Eu`dB^}pPX(-d z6gG5mXYf%TDR+YLnH0oQ7VvL#fQvlbAAaa8z)Aa&s%rlz)S%t%BoyQN`ugx^3*r!D z1i?IZ7a&65;R|gr>;5-XT?V`BgeBk(AwKGwFvLY2U}ynm3aS~}`Xu+dX@3Du>?7=x z5O^k4ttVF&67Jln$rF8pxE?GJp03p+l-LYg@NPRT%c`l70))L8s0!H#su%*fV;HRnogFoOJmv>(h|KfVE;%t5SGaamc&fuY&aKZ3z5wdL2sKq=}MLrZhu4UQb-?6Ue>Y*Fa7 zau8&p-t4XaXe{;wvb2Pq_io~!-sQ$k`}3DbIS{*pKx=4xE>%@k{}IddQpB5j)0JNf z3FA-zWU4AGf)I99Sw$sZxAv?&;NbwMa{ZyXydh4905$#28>1wZ&h);EO~;=IEFh`&2L@@^7DmNH?o# zcsl-=Uj_zFxf2l*ipc5)?TVE~s@c}~!#`s7LDgT*OZq~EyOyPR9w8jZIu~3Aan25vBQ2&;CFNmIj zVG6?s>L|2&wvy?Wj1UMS zaxnf!x#lD+;`85wxQ|%M=jU@EeHA?J+2WBeZz-*R{Ux4s#*21^ z6tXVAl$)4H+n;#ZIW%peI+nZ=YkrV5ab$#3X{rU2UR+YSGWj;-o!or1*OAYxYC8L} z$;#x6>3nZB?eP?zlMYWLH)YpFNs*=rp(KX41&h(kKDT%U2AQVUbUKYHLHdHHRw@FV z2l&UE6?*JHh30AoZUa&p2me4GfCpc+#LW8JTfNtVa8R7%G+ z^V%~d*14c9A`i`N+H(U&h8#@!GO;W)moFf}XyLqfkz#cBjEFCBN>Zn{MfTj0;Pqqt zR8nGoc!4`Au+(tNK0-F!LqlbCM=WgJ)$TlQ1%KGoM{E59!g~k)E|;s17c5Z5i(RoJnXS3t$w+WMqZyW+KJq0NeO z#+YR{h1Z$G1wTx6mV+S!W3dZQAV#n)*u-6PbG1@4HbNr5zj>bcx=|CM#hR^qBWu^} z^W-4s**t;APTvGy?h<5MrXL(=(`voCn@=NkZ%ROrci~}j`*v>&N+?KK!KlFX$7jK~ z>(h^`rU~51-?m9ApLDB;{yymM62T;QA=N_S2kYdD0{L?baHJ zXY5N&t-F(jAn!p+Z;}$ob0u|EfzzdeFBao^;+?C^Yk8inn%b?5b%Za%GoCeeFFcHh zkV_|h8Ovm(wQfo~m%v}ws7zRpslG|@(F2uV7`Sa;X~H7nY|5}SMj^QDuDv_r=($4C z85JnRcT@aJ%soMk$+rOg<{(r8(LC}^c-G$Cs8zIqE z;^ty|B-rP*qa&zFaun3;2JmEU2R)p>rwj49ETFmhc;SAOPIxd|tVR(Ragj(Pjo`fO~u zO5RKi*6&-IZDYQuq7U2!Bp%%YKBj^3gZTRGk(@5KO(?eIKosJ{Z3_p4~EE zW>>1odpo3)HM^#B5i`$44!;Y9rMaB?%lD=8UPiU?1UOO}qJp}8hbyWAW>LKt+53aN zWh8O^>fE3D?A$l@KgX$Km={;8f1;qyio<%P=RG9yF`Blu=(0(-qX8op2Kl=~8JHuq zK;I$dwI)X@)m#?EEj%c~5s6;gs~K(frnQQ>@sW|N?){=531d~F$mI^2r1=YvOVYwA zox0~;O(?K+wrx3HytzSb!X{Yn`_beoOHJkMkf26HJC#D`bXgXcrrBXjJYQtSu`>p# zahD*rB%@~_Y4xoe4(=?i?p>9$xJ)?mx?M_)o~b3dBn_K#vEn;zv&w$3^4$aZ51 z9xaS$4n?wZfX<*Zq1S3d$0_^~gQb8}Qk`gK1w;<=8H16HkC-Q^XWyQ=xjC$IP+34L z02GE9c7zmUMiHh4wmiNUb`HCbYF4X{d}!Y&7nJO`jtK6QUl}#WQv96r%%~lEn78Sk zL!(Sg{_?U;kHxM`7LJ{wJL7TP3k_q3G zx3(^?Zf!8W$F%cPGYxcWWuj>5oQx+IUT9ya{g%!?x6ltA+_8`O?$(w0wci77F4;H4 zsR|f_ro0O<%Q`9)$*1YxxO=(`RgUgWOz5?(&~nm^VbxyPvQlezm`H4O*ge(%)Dyq` zn)fBve*G{-*aN|80VWR_F6uh}Rm0#{{!?Ohr)5n+3S6gAI}Bhq6&3;F=Aoiu9ruu? z82Chd`V~l*{5m^36ktG8j<@+A%EU0~0mOmJsTQ3WNz4(N7xdzV7eG8(Ul2Kths7eY z{DMA0aOv*~a0H}xKEN)PBg+Oz&9PZ4!Xd>asb@pt59gnJDJ@#dWiGk`03-uLLk?N6 zBpUbF)&gmx6#%Yg$O08s)%3s-VPV06g*;??AR@xj4g?ku+mH@ih5Ea?UFv&>EwWRK z>kLD1xa{IfXV zxeS^LBt!_@a&B(!=V)mptb5skyNVV3oaw6-27DS0=~OgZ}2>s`GDz{3-HEZm2d?h=8(?Ii$j|ONDXx{s8KYQMT?%1@og!rP7!_# zzy@18JLkwIcFs3LHvi_Kkr7RSN%y?t@9(|dz`sSdcndmDQ)DC?hr|}efbd?e7+`r? z^!vxh9QzL-^L8;8kBV9Z1_jLwYS)7gvfu`^ZA4O%oP(X6ooph{iGrtpx@M6@@kMYV6n7A{ zkeLY3LZ()LX-Z8?^MTMG9v?4l;Ralw_a8sbeE67slYt?y=)uE>ckS&tGU^OD*dZT1 zk3-%9^dGfi>uVHY7$3jffBF>JdRX|g(&RUQ$1}Z5Of0DZHA;EaYP=$zcfvi=#&aVP z!80md0nz|Cx{~tQ-oU`6Km-;*#Xw!`{;7+uxR2Ro$fN^NTuQ^1kDSY%kG$|5qHn-D zH9cZtWkD7pS0dl}XWh+j06bY_h2;$T6asXCzUm`N35)YL4+5Zz04WEmq;b*FJ{2jn zy}dnDX-j5ib~Y_2_Aq$CAI~0mF^J@NDsxCBBDdK^Ku&UUmzoiF(Q@emg}#A-88iqo zN?}?0du8G}lpjFzr?<<=SpeJkX($|5{$nO&9g2kMKQ(Wa3Q$St{#CND>38MI6@Vo6 zfIhv3#34`uuL2wSB>-yJAxLoZ00~U-6I%Nh7GFpfr2*(+a&$+NDh5!o)c9xmcAePip1U;pu7C5xj$aWDFP0%A@^guWQwj32e?&9J|5&(*3 zCkR3+)8pJ{2y+(5$dDFnU3}(fqH(Ew9c;ZVbGu%a`Nqrs>6Lad~fI`6-Uu`0@>1nYp=7jwp z7&d(05NQn2kP&qdcAT5iq$2|Y1MgOWf3*py7@&@UCI(2RlUjoRgL{GsGJ6rQObrd< zupf(1e_{FSPAQK6H;E_WRjbL*~ryJ;^rlzK^AKt*51ZWuky}@+-6p!mflZK`5bn(&^hX5v-d)ol|=JSSs?f#Sk=eV<{8tXF`+rX+qryI4z5Z z+JJ-xpTGKLa8MC2r4Rszl1|nCUB%rNp2l#ei;6b}pEuTtFQbEY?VRkM>c5-_&3k##>`}+F>LqZT4d#USm?oF$*H+ z10Ao&6tWOZ=mX$NBK{VL!F$^)VaUd1z+!K?4H|w#f1#0qaK#eVeLipM|mC6b_;=6N*LKH9*GceA+1S@?C6CSa&h--by@d4e$-e9pQLNeR{ zqM&USQeC!u9iNA^WgxpXvw}VQwD<23O&&o%cclS|(JmEkhU9V3Y02B6JKOU8*D|{p z!TtzPEdAHl?Gv(qJq$^AU%8XbRe-R=Zu@CM1}~aHXc;WB7-G4~pCk`cW7~)$>_9=W z)}QxPJ|dnAP0#nAh;XMKlhD79@n~yB%iu$(3_>W{%FpUh;$B{ z!ZhSKuu;+g>0kg4?4)RVY<}Td*w|fltwgbcyt)fAcgu>`u^S{8-w^k!iB^Naq4r2 zih?2+ivJn(@SdKW5)i!$9|7n!6%<9-TCA(D-(@jq3Z81V{oX^F&<~kDLU84;GycEG zdkdhrx~@$$ga8RH!8N$MYe)!A6GCv;#@#gmg1but3GOZ-xO)@a-GT&ny{D7+oB8L~ z_s`rrHMeT&&MCT}Ij47TS$pkgJ!|c~s<8-QU`Sf-AHKU6mTu9k2uSf;V+<4mB!jhU z=^Gw4Io%rOp8V^;)MWe%{{A)t6flLZ0F@1MO9CE_nrE;sXJQJ=gPl(a z(8EA-7HK)$J`Mb#74X!D*h|6n4}RBmZnVs-`t7Bo5Zo8*8g(WJamxGyF+D5d<^d;E z!DJ(TYt|*#%bx>ItlRw`u7ORz;0-mR)o896Pjq1QhCm2ty^CLbFz=u>)k<=6vz+TjtM8;^xF0jn%!(+Nc zy}plAr1<6W{vjfEXH>UT*O62*?@)UKzWe~`$f+A&!SNpxoz8A2Hwl(g2$tU#fF)+* zd1%{dSy_~+ngB|+Z8}DTO(HQB5C|O@$hGI4?64f@1_lPO!7=^}p}L)J>X=X5OW_qr ze-CwRpF%9fCpeSRCED96Z}m+_2K1}Mh6GTq0-%Ip(J2kUun3Sl z1Nk}E6XN5K#^l&w`V*P}oSjUB@a&mg9_#m&r?7s|2c{cfN5DKiiO?18*~~%Z)}ZU^ zypx})#SOltX|`A99pXKuamnnAaTDn1lt)T2t$z7rK7J-N48m9C4QD==f`MYq5w_1T zHp(Au84VOMOcvhI(cucm{|^Ba(<2b!1<1uu^?yAM{~# zP(7L!yH7Ep@u5h5cx;RXQ|WFOrpnv&1=GnSP&I@I@mPY;%6 z9+iYYx|#*ZKt3Y&2mux{pJ2eT1b7zlb)2xI&Hy(NFdG5$;@4y`J`gQHGO~RNP_cSH z>#Vha5z$2UckEL;5{}c81wX_^RcsaAs&D0d&NRAi)9J6uKQwfJ@?Hexa%_$6$a|i6 zAeW~MHhp=wz;8jln2{kX8uSI7tpCXr=QSx^{)S$AKn9bYwpdba{U+Bg{y4*$<+mN- ztGSOJ+o0`?;;E{zXNU_TUwZY@kkuA@IqA^+UdZ)R@6R?8JbX&~S#vy;!jt}G$1>&q z$PE$y`wNA}BmrQM-A3QjGP^oDBrtnkVcoRyB!GR@+6wYfjvSx= z%kiw`w`;a+c_YIJu$DO)*C$bvndS-UF;%m4c;uH;SAfzQQuE41V(U&I1JIlEAAP_8jnHSz+t1HSOcJ_*Vq z*ZA`-A^vK&{Y$2b@brQEopy-yS%J)gnMRigPW~w<1_x{cH~8R$k5OiCw=U9Y_w(xp zn$PL7acVn&cfZ2~K%XRQ5(;c0cdTevs`Hn` zySMrVJlKkK)M%YHtm2CGBGZ~oJRbcdP3cm9qKEe7oql`77epv7b6-l=+iXOvA1(+7 zzrKY-3ygPo8m@qY@0>=Y+hRF0t`C=GmGQzb^xkl{e{`U{y=;6n^hWvi^0p#CgC7?q zsKGH)|KyG@`E-L^!*TMZXilO24=}ZI+$m?;9rr4&r#q`~D#+r9a_UL|0m+{{9s10a z^Wqr84rZ-Wo^%3&VAFiA3K-z()uw2G>l0Y+f%Na)So3w(>!%}P`7r>w6Q?K&dwq)m zFum7tH;jq_BGi6r%a2n7>jse77?#8wl+)4zn8=EDcI-gO+f4rCZ#R+2y!hk3D1uBJ z9$rF7a3R-Hx;JmR<>+*K(HcO{Bl8|bly`=)Y*a@cKixiZ#xju{e&BbZCJn{2SHuEa zJ*G+#oXs=eL8RHiL78{p{3F92Z8BdcdZVOUbJZ91M`@!k00N`y1 zKtvKYV9l0eZ3q}-ZA1kSyE2nnnK7_BLBav&F_0)5NSO|UZlYXQG5pKke*J^XE4g%Z zF~8S|ISBhDUN%F+8bB>;<;KH8?3Nk4~$O?qA){L`QolntqM+U;Y8yH37fCS?{9r5L@AhxizI zY1g0hGci4A^(NSFl@W%t)Fm!G^Ehd(SWXiKu3vfikW1wJ6zcv=^@<4TeZ$enP*MNJ zF<}(DAPbR{6DMJI-q9LLeKfZGX|-KREMM|n{?iXZVC;6K1eDBe>t*S@VSgTunI8OFJ10kF0Vm<56B07{CWdI}E@ zgad#9t7O4>S_jD5j!8li4s_tB_NacnHa&8;j3wK}UaSXK^3@D*{>e{0RlDr&-iOeq ziL7j24J-WfWbs(nIz1nxgEnoWe{Un%x1J(D5(p*SCV92p^Bi)z_faP{pd?=`uiHNy z==yM3B8+!@HC2Nv-Y)stqsUclN11>^zS=(YQg>j5-jx+&(Fq^tfjuNhH%%hETk74Y zrY^*dts3Qy8`&jiv{8#lREix%_Mb6k0g@~?E=B^0c=geN zq=I83+OQ z!0;wOuED4+AV$HC5(wm>U}Ow+G}szS0b=N30eS#I2aJ^Yi@$7sjz&OGkWu}72%v1W z0R*%X49rj{Z&dGFD&Xa40l>7yM%V3pSYmpBkj5b<{)0vhU{$8195w~=#Y322h%FeP zZm=*hKS5GpaYw)l@W#d@Qvb24V4{I#UitLTZ>(#wr%#{qCjr(pps4}h08H`akNmZC zH|Xf;=z;)^K9;9I{FfDr8OQlErGon|VelJDQ$8)14d4!-cQ(!ty69X41A_Yq2Sx@r zoq*QDzV);nFs74vEb##H_1c~wupQv-|3$us{qsE#fMD;7>g85|X-c3dDBV8>004~YSF%lqj492rX*fbqWLhC|9k*lh!8vr&A7W)RCMXtg^7H3km4JNiK%E?J{tC;6 zSnQ<5CJc?J7AGVY07iIno(#b9{Wp)O0)8rfHGp5}YJgGP03iyyZ5j@k8bCk)y>d)A z0geB!)&O$C@Ne374NFgNw)lewAW5Zw&pkN)C7y%5FaYCj`EH93kc&Rw#J?j7D>$e7 z5BC529hxQoKe@r|U(K4_K4N_Q;Zc^XaR<*7|5`v*7zgh$t{o+a^Cm$yRj0!(k%ds^ zg6D0DYL`JIH=?UQ#xhIWumGM&2EyZ^C?(!PcLh?Fony(0xG(LclGx>)7qaCYci1l> zUGVP>8?P{1mN?IF@aI2D95yWG-%z1gnKWN+A6>E2%2GfrndAvZKfQ%LwM4U*SiT06 z`$q+@MzLF4!{HnX>8JL29l3RKH!4 zOG}eJp-->zJs5)u(f+L|dyv3)hmV4{%ijK0eEBRM6V2iF(2Z#fHp=|5kZR5(1PuAL z@&tdte$VK<+aK{w*Fdl#YCzF7aEZi_>!&ou{cgU&>XtDpfcFEOhc)DCXL>wysHRT{ z0E%&cftX)PaoXEC&;Oh>rKf))n%Q@P1*ZXY=WiT)+x=Iy9Z+^{d5vMHChQokOjsN@@YGKqDM z9ZU2-NZw;$EXK%$BOFb>SAT}Lpl-IJ-R=jG5$3kQ{AQ`P5=l1jD_k~FH!du599RA_ z{24RDddlNNDYr@G)e(&Zjyw%rm2WF?2QzoAZ!3me@)zYwyJVru7qlb3{sM{*F+6Gt zt8Y`0^E@Rvc?8(1`xS9)s*<)lvUhS2*$g8xl^Hce(|eN~O;V4}d1L|KA!E0(^|KDr;0jSmNxtf2{|g+hP*wqsc=~7wM9lgu{t5Aprfq}#~#E=!3eP^i$c2*DspgyO^d+xNY{|fa@!Z(nSwljQ**&ZH7KAvTE ztap--Y=V`cyp)^(%1@?!L&#o0{BrZduWg|(f+WuzAuBIAKQMoMsj>!Jg#KKbMX!Ch zZ5+rlJH)*FzjID@VBucV>?;!X2RI=`_>r0~*lE#naI3Td{Do61n9-**m~9BYohl zuSRRB5BTCmsS^t9aF$N5RPQSlLHl278LCdFCBAeyyi^WmV>rz$ix1m)55N27k%a8 z>C}a>lPl&Me@uT#k+P=HxhP?3V_G0vkWsY9?|Wf;76rGylylUuL5iJJhVaG-0C{cn z>i_9N2U=9(SKQAl$4KOf2uaxJ86)(x|D?gYd;JG-J1iBIFZSPDPRG?(6D8r7Tu2LE z?2bf>+6Rmkg!_t~Gd7U5xO`fejf#=W=FN#}Oe!W-Es%clLIQ#P+Y~QP#W&{f4-I>J0hy@@V@$#yufW2Z z4rxib|3zrIPFyQ6qrLX>19HiybbzqYA#B*p$;y1e zNxGy6Ip$C*}WNUWg%4e5wOZ!P;4HN+!&yD9{N737WDHbrEf^YCZ2{8AuG zYbE76ZvDEsF3u%Vmr5x>Bz?0 zwt};JH`UnLyFr+}4oO=vwY)(c$oRVBp)6G*gh?1Vwz26HL=z?J4cklEj3=#Eztiu7 zS1frnKKvH_Ni(JuiSDL>CGd#CMiVOoeHzP9w0Bi=P{9~pFuuUca0TAKWB?D}| z=0r1Ah`L|_Vzrh5N5|8GZ!rnMePJP?O_*uzY9$x2zmg03q$x{Yn<@5)-HC-Cnq(_^ ztKj*jH3TfAvzElzQ`1O}O*wslJd%|UClCH0YU!@fk+$0CmUtIvlpBNK3HwV|KE4x# znO|`#qN~+_QqK~Y(`9D0pUdrw0F)EDc+S0=wKAOK{!pqN%6PHLQ!-ORTUHgpobgDO z3t6CP_P|C-#&v)BLjc6HCtCE3nfiQ3o*r#?K%Ms#VXI_8zVP%(o4g+%*PQG?LGEf^>#)*(8|+rG3T%ky0UqE=;xmOB>7XqekT--SMr)yAafEaUp*Bs< zYjFAEm0LTEe$+9?V}mA-6x}&M@;(ont~e)F+iw;N^YKLy5xpDZ=y__&lZ#8cJX4)c zN=EciS$%7jxOOxC$ERd;>Sy+E&Q%14yli;G#FpMA40crzC6|rRKe+MudfKo)&aH21 zxwQ0JGP$nSbw|e&L_{>lZq06& zJ>>)IY2f*4)g)+IqRRA>e$Odw|4(|Qmut4tiM70RL0YL>SH3f{(*R*aS5{27ec2Rz zY%cPjHrqbFKc9H(WN06E<6t3dy27B^!(QcO)$U}{_52+2t~usthPu$oLid4Si&A4X z2^|`wk-lt|*x6)r;z{K9i$CJ^cRwOj%z0k@Zpx#mX*EY%Ae5uo@HyPBWqqaB1Ga-} z+1h#S?*<{RSfBa@aWUbIraROyrn#Ta8>HH#BQgm#ec1z6Z>K9=9lS#mI^`|G9M!k2 z6g{3TW5;rahcLX>f#b?&{WdWdQhZ1vE)_X9EJJ`lez~PZKxVtibdcU8;wVa-?p`u* z*n6eROEhVv-si`1+eW1DXer6T-Vefjucy^>lPjlQ>qt&FS;r-^RyCunDr3_U7A`L& zHIcMcG5cahXq;^n*^OTPjCQXW!%*Tv|BMG-CamHqnTxG@`yNxha?_cD>bs@(BXxf+ z+__vf_)8~>EJdP1EY+3|dI}fCjv6Yepo>7x8y(!GQ)xHL+To! zW1&6z9nSCoimx`rVau9|34D-vCMk|QHPlzHy?^s2j_AEPfT}dL)QPx)1%nks+h?l6 z7P}{-vEOE=X6bx4bBY#uw>jZ_DF6JunkonlGhrg*J?N_qUD$Sc-o!kzXVR+$Clf{1 z7jU~p{aOvt-PZ{vDXkC}S6~BiKz4Z8j^`;0YE=CR?j>j`Lm)E(Dy+JBY2?L5yzs{ zK=;Z=t9~_(<5ccB#L>1K(@tU266XA?bmw>{LdiFn6Nmk4wF#SU*1riIhUpQz=FK)( zhu6-p_ZYmvuLjo-Hg;#EKNvA@*c9e{AIbrT!nw^TeH=E(R8rqEcpZSoKC7(#S%w(< z0|~&dq@etPyilRq>%G~1xLcF#?=3)2li*G8rWD(fNjKR?7oqLZ7j7eQ7M`Yl!cAKo zP(rkhyWwb3L>1?*{_cYsQhyThQzFn<5*`UCSX=~c*EP1e4m-}yBfR;u9`)>twTiEG z_Nd=YpBzI%Bg&ewE1#;QofND-XZu22w+@%}!#EoA*~iW3+F_(APS(^=k&iSagLMSBF=)vg`^{+Kxy%bESBRHhW`<-hxBfIh*N8ByY6XNEq_ zcvB_nVjuqRT3<93Q#+0n1OMIqBbd^UpSe$b#IoE(pW1EEp|5alKXku$vYF)BX#9WD z6I~(i&Np_M1RZ7Qm!F498@*1lYm*u#!_UV9O%INn5qC|aQnKzT7NH%*S9iXHXZv!v zz1s0+nyK96byEb@n{_0I@xG5G`$p??zb6bZ(_Z?2j#|u}^vW%RbcFg7*pmkHd@VA= zcjk7e%I-j#x^M~yhClW5AIuB^H|?{QZ81TG@z{pe)kT{SR|<`TP_QYl;85piy7jG? z!1w$31u_S(KgRph-+s}?#(67I(B6P)fzc~Vqg#%F^W5Pes|#Mj#q@Pk!Z=p!f`4S) zZz~rYntTh2&g>_bst&FsWVkzMQaNC7ED8K46D3xm4wgMtn>S zlWCp@G%PleA*OM)0YXz=NI%9)W4aDRH~A)ABDYx`?O`>DJF{+bZ>5(TTAOk|IzF{T z4c!#FCuB2z;ygRQA*{oqg7#AX>*Bj(q|KMAuY29-gc!Z_f4{b%rqi!#EFi)`VMq}% zA3WYa>)UTDs(MotI#@VZV`S&>?ZU3)C1znX9_!4Kk-1YjCwAlYk05AsNE=`q;*CBuUS)TmCB>T4x&o!~{GOH`5}nz>tq4 zXYK<9pdBTV!1{h8jSGQT8N)374J+9YZ= z^y=X8T~R|=H|{(`sUp>+GL#ITAS9#<3E+^2|Aq-expak>{J9+xtWBxt*1PvMku2ve zU-C_|u4a-SWbym5bzgf8`vIB4ZOBq2B`~)Wd&80td69TQ%I`_M<2q;Wjzy8hiuA8k zI3}$6zD+!{bP&{edo2r`NheKXIJN(S`!>&a$H)nd|%&(0cV0)YXIs_#& z+tz_UO>9YORSFlil`$|CO&~s1UjdYFNl&Mu*BGH9w`{ZyZ3Ye-u8_j9bhf8O_0Qh* zo^Us}`y`^pTOAa4MAoK-QDd#x1b@Nrs`Ozx?q?QqlSFJPfsE8h_YsINZBTx#xv}7B zR_q+i-s494VY8j>}9f9d0=XqnBp(AKge}aBqToNs|F8Z zFGX69bcwn^8Paf>R-6TnpS*&g`@1v?u3x!{K&{>P39LSRH(|pBO^b#E*r`ivF-0u! zu(m<#Cw^y7p{UPe8vYFE$JqX+|DcVxe`XN2GZ3vCB0;d?qEfLQ_w?eYHURZX&Eg$~ zn-{za6O_4v6++wlmZ1l0$g(21$&#pr_No;wlQX?; zys=-bQt!G{xov4#ov8=!jwPMNo0VK0?a%gau}pHOQJ{QNZ6hA8SY86P)_Da<3-;6) zL{$5Yg(8Pn!DFU~zoD;Du!>qwAE9SpG>X!Qkm0Yi2hQZkaeoG5KPk5fnSOtu`wc*_qp-^LshP9!~xxipl!0JQ4eVEbm`{^erwVZ zm9NiPt9VuP9bO&VyMTsd8*`*ly+m4u#zSqwx^rY@0M-Vvm&lLL)zX5Tb zbJTa_e zTpA060$TZ10`aVYz~9@-%aUv`RC~fvy}2=bzrKoL^R{9nwQbJfNRXA zDTSMFc!YcU#0I0cpmZrHX=}Vr&iBV$dr9BgBp*sa;kqSlZTFsf-8Vmv)aTZUCGZ7H z?+Wp=J_!Cyltesc;2`jlv`@jX8g&X^%b9c8``gkXFRrLX8}#C0+QVUYX13GMED4{J zX0O{}HMD{|WW{U!0qM|;quRBsJ1)mXn3y=_iJMcba`TiyZ`|V#+CTd>Nd`~et>vnld&a#|5$l zxIE8k5IbYG4!Lm=kqn>pP@ICq@W9xuq}@Pujz$O7B(oB{gCblx6=^`^)O?NZgY^!F z6`9W}|GO1ew^o&XR~M!Me0jCshkOjHbOHx=RI$L|AxpwaFdj;sN|n!p@``b+a-k2ET%KtUN5jXjZy$OY>qVqxWWaxQWAv3#9}Pbv$S~N1S-g*PW$v z4GrBf`eBf4V`wSZavnP)NG(Xd8|K zawUNz6+rDm8LG1nSHh7Vy!rACHlh8nuhQwR=l*P!AAWsFhXoINv#30gdiIW(3qj#4 z2qLjLRk_K?zI#deQlI6>Oa1Ek%C&ZYRu~Ii`)PInb$WddQf1K`F~upGb6Gi%N7|PC zzqMXDbWaAO*K|s)sn>DDnvQ`MLNP9-@QzR=!=F3z-L7KK02gSusVmFgYGM+C7f&nv)Muf7Nsb5MCY-1CT3j5qlK z^U3#;Us8MOGd-~z#Pe96im?)js%IGrSao^8T4|K~xfH%oi3E2pV?vs!hLVvXkOIU) zUq_B}*ph;k z{!8e@#V28Bg-JXnhdRheJzFNU+7a~MG;+evkU;dnG|)MuXR9>NY|zE!qg#b5VUL1X zSY89b!6z<*NZvhenC%B5<&XQDH%DLDsM*b5VdVt=4Di27wj5jzI?V14PE-DK6j;F6=~Wy^W&61sl(5?IK@ zg0VepYNHkTl^5b!Ta-W4M(72nv!91Kb^UU(($;~?ev7Pu60x>mzw02+N z{>JYel-YeihTG;cUik~*g!au=#ntDt8CMSm$-rBB2BIFw)5E^vpZ$?uNbvIHw0Qd* zqy$HU2F4N;4tRw6H|&-AQ9Es)^w6oO03nPS|0g72`BfyxrC1k%1T=xaXW+Lf-xBUj(_^H#lkG3~QKp#0g zy!d0kN^Hna-r6;y1OK8F6ZwzL{fFttQTo3_`uy#Pkpp-oIiGD~SR~ zeNGN5^tHxw@YQC24cZ#Pd99GfgKhN%khV-2B$qAN(vXvrvnjLPqv2F5-?=# zJmkaKiQBhCA(NgnKPsPJ(j>)teQQ^<;618Odgz|=J?u0h3eeH-web18cSB;YZz1uzi4RfR%g4iuDEw?c&U0aXmNz7SxH2z=XP?+e5I zFEW##6H8gn8*1b^*7>4m;pkg(+p1Gmvx7;uu5o%-gn7-R#~k?jQJ^e2?s(rbjz(co z#(L}g0b8owSUEFGx2vWfp<^ssg*EvAM{@ zz)0dGs%oj-gVk!WdX-UZPfG)8(Ko_IEDIJIQtm`}W5-#)p#e&0IrEPa>Qnr<6DV9X z#Op-rNjIIZE-;i+#~t#X?eE#cS+Z!o1Ov_@+iJV29k^WJoEz-P%{ zU(A+4gQFZHxZ=V%$U*h!ng^6lQY@}x%IPZjC6KUdI2S%-CD>p8u)VwogX&d4xjVgj zP4xLB5(i}?r^g27SXRlWBt^bb!*(IhkSKf1E~PxI)5mHgz9*{BgF7xCL13r=2Ny2* zhCL*dn}xP9wcoI^2W2 z{yYX~V-$`BTN}LF+>=_^?`ETC93NZB7e|ZeCA86)L78 z-2aSd=DC{-nWvE@nzwSh91%X+5Sqv*ALs|;IT+46)rGd!1_zmn3~Hgs(u?eKLiwqa z99f6Ip!seqwz7R=bR)PAguKh=7QGZ)egj`4a{dAO8=EHLx1m+i(lK{ndWu{%cb(bS zi-r_=_Y=}3^`qsF~8d&!yPNS)56Fq{T}sdZ`sOr(61B{nG90x`Yz}!Y;?y+X6Rfc`$*VWfrc#jC zt?OEGJ$S?q?OY?JS+Csa=`e&-K*N4kINyekzd#(danvt~Mn0Apq&W$uJ8@oHr^WWT zV9lNPX>(Mh&Y%h_JIA2NvG36J8eH)-MrEC4l6Psj$W2T)e7rx zK`Y^Ycx{qP-bOUUGi&#`%$gaW`eIP|%h`ajs*}kdJ_g$>9pXK^4nE0$1VKo7zI7f4 z#kGUSG*3?bIzuYn4QAS}VeMEYP3=DWK|b|dy?c*oZ`Q)OySk|cJ(WzYPe4a=JlT3I z)p;ZQ)MJeId(36#t!)t>h0GWk3Z+ae^*ud;xub-o-{A7%{X}&$eYdvWZGr2+c;NGv=t+6Mjh2=SsOdq9#(K6( zJku8Gmy?e)JGxuH{0cG0^-iGI_z2hBT)c&uU_)-K-y#LwwmcWu6(GGmsM>mu&Ovcs zAnd?(6Vt#wJ-c)%)-qiRi3FJlV_JlBE)^SHc1}w!?sM&xOTye80c4~$zWT`HP zS)g~#dw7a7cPt`pD=WDCT2r}d?6Wi4#PsPoaC-NCiTR*^a7F0N%`>#NAAf2>o*-p| zs2Ag`EozaF*XB(8#m^vTmpD zw9WHVvcnNB@P&Z`?!1KK&LUxkp1KUgo7wZZooA%dVP|N@eJxdBJ0V2StR3s<4`@`K)DAqYc%3KnNLL?zhh( zRX)xlS|-N1aXpvd`(2N^fj)}?Rvw!-)z2#qaHjYwF0G_1S~6HfR~OZE*K}O6A8>a0 zo|xa!KlAspG~c)SHy?Roz8{0=f@dssUQ)c=r)s(66Vh5KbUran1rxHWDC!P@@CF0^ zL16$L(t95NGpVU==TWr?sjybv2d?L$iZO1}Zu!B|hE! z8X*+TqC+}8x5!NE_Z8NFSHPe-jMtvaLozSW>ugj>XqspvGhbltP(7Y=ejR@(w{D76 z7dl-AmwJM`H(m9EESTi=I>pbnr5HR~s;3j+ao3G*$j|WRtk1rr5ozyc7)+d`0vwTjZsC+Fm4YiL0p}l$;4g+KDm`%T-y;Q5)JClKJ8oaZIHl?T6)CO zDQ7T!&#M=s&t~Z=iX&COo>C0m;`7y(c;_6hKJ1W~xG-2#MG#9ZBj$sZYEql`7Q}i@ zmkw>c6bp1(xv#gF!4!#g*?CtHx zr5qqKwqNl!xUUdv$^WgB?ev z*)~_45Q!O!^F|Kdiflx)6{*5mgCJ~#spbzL69}96N;7`qi7NavEpq59bD-UG8#UB@ zl1px7v6{fd5c1n+a^75U!W~N09J=ZTv*$5Gw`2DyWFHVZ2{qMU=U*sQNmo=Eit_0Q zg}6@&gx{7EI_bFa-rMLxx8H~~th03+FD(Rx$r|pf7GSuFxiZn2RJ|k1wbe!r;p`z5 z3rMl2n2Y#^Q?`ZtJ>fi^4=}~q~CF=OsAj^)s ztf)2Tl{|bcxtD}UbjDIZP0iF9bKh1jo#oX$6-JzBMYLXx!nX3B*h)8`$Jf_A#|jBE zkr8LJGI%U^zo`WL=AH17u!i@{QxT;jd!TfDI3|j^FMJ6VPFX0Sct7IF#ckln7~*r)V6iT|~bo82emGBl~DiIy9#~ z4sDM}VPxseJAM5;mn4@`FWesWq1ej3$reTPxt(EbQk)#9tz4f#aEK}tht@usS zcfmM2DdX|nfCSZ2+`i8`VU=8t>n$M;Q}>#~9SW;_7n@E)q1)M%#s)qc+ng}jIvIRX z&w1VB=ypCtIK*6NXlLLnxU4OYFmHTzFcK2a;UOMgo&Xv7nK?}70Yx2PE%|zcU;m*S z%y~j^`II?~Ac(ovQt}1&n zknHjs(?hMNzmK&0UO6m9eKP1y&$mY@F5qe;T zy89wxs5Eu1nb#|2_+akDcuaMRej^L+$_f`2OF~U`kWac`*1V==8~zb@i7piGKTcff zGt9W8bB%SrU+CoHV*2WE>6U$y{4Qel@o+gAN8powC*1^JMK_#;sCws%(kw5&osA54 zyhBi0e>Hhi*FFOq2OT!;O!U{5&n)O)e=~qb>#d`kSxQwDp?i;5FeuHJ0qHr+w0Xl# zx;tHBq5~h@5?P{$@m1NVPR3GUek#Ik=XaF4*I{YX1UD&Bm4MO2j#J-Ge}7POzmaYE z+AORkO99fIf>V>W)C3z+jOhzpBWsK1TmU3bN*39q*^=mZMvVQZjx{2i%r|vtRcbt< zka47pu3dA*<0+;n$N3Yn@fvf%60OeEn~2vqX5NJN=r2Cpc6iC^sUzT`)es7O0+~z4 z*2uwK6jH1Bk_;+LB80bAip}oJLUL&?IrFUqDygZB5`;Z`32O!1osh+y`?WJhcDuj& zVa`hk)UrqY_)_go3$0Jo;Sbg8IoMR2hMJfwgsUqEIF^w?NqL$HG-nd6V<%LEyCw$s zwYr(|xvb6o?9R3GRC{I_b=~pD69Wb6D3UNAC9JSoTP;LaKX-@sqf|1@e(5A6$ruba zsIU6UC|Qyh>praq{obvF81+joo}~zUnkLu7S)HoWM=J!+c^hfsrOPuenIXP3@?&(b z{<4Y_%v_xZQ4|8;woiC!tnaZ2>hH{6j-Xs+a?iA)P1{o+Z$T+1(GXv97rX{SFWPj_ zm!y-u&yN_rHKM`#okWI~yDua$Hj{0@oL2g*gjR9(`x>Z1Tv1e-h#K`LJi3|>w8j3j zXTs$ey%IBy5g6Oy21yP!hoG7Wvey->I7EI5{5eKs@PRr#?|LO?nTW_GTVEyF8yp&$ z5sQ4%f9n^hkE2QYpbR2+V0as8D?_v#Rbn(^xKZ)uhwD(DxgBZcj35yu(rDeOj5hy< zlOT^N($2;u+s1YfxkSJ-OG8UDX+^pYRfT@BLqq7nT!!k7fqH#pptPlr$F4gnKjTo8 z>U!rdz70;+eQ#9jY$Qx8>7STZZ;Cs82X@}Fn)DsB$QT{UStg7`>*;mv^w#F92$qC- zcL|P}J6|aZc=vUm2~qc{DqvWSyo!8o@rwkzWa}lvEtPjpzB$4D_#fHL zJYv(o^fBC#uCuXxbtaIWII+MD2*EK8oAKIWCWT&g=o-fl(`76M!CmtR+nWl=w3K4@ zZq-vkxB@g3_1YpkR-c8q%mx$~sO|2qMH89=d#PV^q!_e-lC9S^;|N47c`ujUNW&C~ z2T%9uyDG0q3w3U!5@}||Az;}-gEwU9ZyYrs86iCETviiN|3h z9trV^sG(0sM*La$Y0<)Qj-EEXhqZQx%TLDpYI`ho>>F^#&C8>6PM@CW7h*<=xtoyg zfEQk+J*7S!Y>4*(dKE~i&N<81q&vN=Iq&*^a|JJm?w1S_IG|i>YeF^TliO@01dgkY zA$?`sn*nmYj!zqt5*_hyXe%tGP*>(&z+Z*d;V6Nctc2;RP)b3jLjiHK z3B36chGXVlDw38bio_D4jY%%jih=iKbU^#K#C@LgoD#ZP!_n~Jas4o4=4ioW{2u99 z*1r{E0Ol$XM*L>=BZ@u`$oK7TF@@c;u#_2>h2rk4?>nb9Y$AcXtg*O8=@FqV5v%j! z_+I*h{kHl6G_$?yg*SnEs_|jbw;#0P{4dv-3UJC%LKJX(e4(CHr`6Z4( zC$)ctIA~m;Yg=>MmAbenzH!jVi&3L<4MAn%PEvSTz|ioeuogic@}cX~ zf>qWmX+Imu;G!>oCIr({FF9Rh#PsYu!D(0RHJ%>uXqXhveTuNj^Jd2^iEPpx@6AUO z!$U!`rs{YCt(v_Ng-cwnucVDH*;uyna!Cn&mszyqrxU}&QRg<(hZTGYKzrSnoTb>X zUW}#AEuav~F{W|V_QuyCZ}9saixNg)59V06%^X>=^ZSvIAgrX>Kd_|a@==E~XUL~aIBtVDge@8B4bXh)qWJA8dyE-=iAXCvg zwwZaTY$E<8M;S$s=gIY(Cdl!&F7&5mAlJj^)f#j||BkJU ztOkrZf&Ju`{O?no-|Xz{zbdHE4jh&DuR7-a?^DPB$sT+tM3j|VGTCP$21fBw(+}3n zn>Su)@IK^5SVD7Av^(Z!`wQV&%A96#J!ErTMXnD)7#Q-~zfgTB($vqPk4LMYcSzFP zT`NLx52-aq5oKb}*l7DMStSnVfzt~viF|wyuH}nmtE%fzz4yg-bjE_<#w};|=Fkk5 z*6-c7hD7Dd4Aab5n}s@0QJ6xiqf9Uipn7E#me9>J;HVCJ7rb3(luex2@T>YtX3$Cc z7mvj^*YPdJRm5_1F|G%whCqdP9NW2lJp0>GEnCRvt=2j(MOW)$F?R5Ss@e&;4HT)9 zIZxk;3OoBg*nRv&F6qa>CAQJ2e7TJw1(UzW+h?;<*sCNx3+xaR@RIDiSn`iG)3^)n z1_)nJmqS(mIdOmdO^w%%$0c<08FIm)kv*r|{VrQ-q4!<%z??;|6d$6LfHME|q>QOLXp zcixM6o{EhfO&d2K5#I>gymzWb$et1nKOBRfYtf`Q%r`RcL*CWnTGG3he^$xi_%)HJ zz33$}ols)Xzl*4fW%}L#B{UNC?J`;Ww|s`Do8R&s0frA&i-iH7gq(TdF{qNEu! zQN@kcdB*)7x{+_=N_y_<*u%mw(5e=T_|zP4$L;Z2>ObS|eSKHlgDO-i&^d=RTlUag zt9^N8u~lM5fhCg-7RS;2=+zZU7Idt?EooK#nMQH?!^gUeq`k}R;r3gu{dju(dJIay zR*{MJ1_C$J%KS8x!w6fiPJX3xx?y`N`hZ#oSml3ZbO4-7k^p~Zy+t^jngr4iT8R3%ZYn-1TbYd6Vc z%OhlayA+?GR6ZA4>+LP8JDxSra?#F1DsygY&BS8c=_V#ze5uG$P;ckDcDpv63u!7I zq!zoVoUmtmfHlKRcBcrL_i~XX?9KbQxFhp&eibiof+j@~7;Y1zuzPKJ0_MJsgq`$t z&l_JdJ`WT7WxL2%O|hq`W!T_;z<1HVU)-%wSL zArrHw1Dymc$|d*qq4kzwHe_xIfcBmke0N$RLYen&(1xc;2n2NDsXLo@! zDMCf-j`?OKZXZiJDB-RiF3x267DrcWTVC0OCkM!ROw`w3wo|2GM92XsVjA}O)rREj z#^qZ{aR+oL4`XzHGO0rJOl=oqh$V6_EWni0r_#wXjub;KfoK*}~5IYus}| zhng zojm;Hym9H68qOwA>SOBeC$A@=0|WYNXW7uK?~x^LD>68_4`QPI6o};B&(l^E`E2U&bLa zo|TQe-9$O$$feJx`d306+dkRrwPT(ichBl#_;y&Ht1YS5$Gg(G*&f@=~#zGb*Fh>$g3J)=uGZD+dh1_{T7|7Ew} z#7D?+8EDMe&jn3~H|eMNv^_<)uE#??r^}u4*?`Z$`cz}_aG(^XlET#R&?0vcRC?$N z;2f4o74AkYw*o{xKFNMZ=r&H^T{Jus6B-_8?-}Yw*}9rGVlgt+<1c%k>oWKm#nPqX zKc!njJS+{JRy`N{s z1)H_$`dW#D2L^1darnTm(HErrjd4i`&RZ+r+T}Ot$k*~@<}3mhcq15_b6Ur~yoi5e zk8TQ)$%COGkL(_i>BLs8BJVy~595Zd_t$||sj7Yy1zE(9`^ggYU~y^2UMf+ zChN2uJn&hDYKg`_!fC&5f5W=8?_9lc<&40=E27}tmTiY~`wedM>k`U1$}!>gxwZ^i z%1i8^iv7Kk!RKWXeg+AJ-Y@r;X)e<+IdorTNjY7E>xtVx6Cu^y6`|SWkT5$D@xE2+ z!JUrB7fi)6$U@FJlSGGuDatR5?XN3DY&90Vqg9*T?|-Wm@b~xWAw}ZCzz{5;MQwP{ zQkZ?Mlw!$(bFY@P&Wco=C}|eQFVemVV>$Y9DEJrPixts3F!1vxK`3svoa@(u#e#B>dB;vql=CBjE8Z2oCV zbHigeb26iqST=*rOt)aLU*;=LT z>Q(X5q}|t^K9nESh1q-G#-2oQRyINf1J?#^7h@Gk1$FnsiB`xVI=c)M#dmYAsEbJ` zWxRhfZoazG1-NO|)ZLny-0F4`dF^1l#$7jGaPt;X`{XFuy~OR!i3IW#Z@(^A?aSGZ zkC&puc9!&bv7(wNm6$MQ-O1RyrN@zGCt{Xiw@V(L|Mb6*q_Q&uw$^JFVDH)=Sva>s zZ>c2^jzbGhekA`mt` zl?i!{H%X0GTJjw!>Yeu1FJsqc+GmWfjCE#LA4@~x)7Yt!xxWb3{ri;t%qboAw(46h zFzVkUEC<^wl;#l?KPn;3f9Xc!R#@3jRYzp6lf16o_mdOvvFW!*ht=SXe@+^+pT7K= z8m4qjg2;1qWs{&9N96Ih5XD2>R9+92A2eh86XN*q&MUOfE~q|o~0>_{tH9!m+Fn?tYVLk#?;BXkNb6%DOHwE^MyHEm7V zr5n|}sW=i5ru~#nr|<=J_x?Nwkl{NY8bPI4k0{N5ABAPiMIh}|Euj0m>FdsDeU zl7*uLO8r#Dim04Yis_dMG&!lCW~q!7^432QH5z+h=u2XFOhLv@YOz23JU-Nqe{i_2^L}k}3iXXyu&qa$&Lzw96cBcF4(M_n|uF1un z)+FYgkc9M4>V9%Nw}llEl#y10KX0QS&)#@oVbGBdy5=XxRS=AeD7Zci5B>yWXr2$> z2h0+rON0Q%3h#ywyR@T56Fngi;L!$yG&(G&f3d)2NbtU$os?-Hc&XV%71izz7)bK5 z(jrrn;yuMhmLgcW zklQUy-K$v!8S{Iux_N4O;4CjA@o^l^fX$Y8npi%Be8%?y@f{hx%{25zv_J!CZ)s|v zGPJ3ynjg2GHb}O%ao(54 z+!OpX125dxEUAWWL8~&t)Od5|EGLrR!w-V%aNay;cu~qrbl$g2tBtQ^WYr;iO_~R! zNtX&S>;W~pYuSQZ=r6A($ zLgwRnB1B(TUkL)_`I8l>?Zr-E}!eMEh?X7GNqEE;9W+v^A@kKH?=48Z0ywd+u~CC+bq*C5rPea zukhgOSE6pPnd*Q|r*MXA(28Uqc;J#gFyaR3?pD^%jXhNk0LxUNa2S0-P*Z8z7?5dX zdtSnVKpL}8!sd&~C};}tlfoCr=}Q~!TUV&mFu9b93VfJn%zGw*+1!{y$YOi2mLwl| z8(#~4xk7M-gOwY38wpq|C4G2Cslhf@SlN9?%Ru|)|2xF%KSPsjap^R0LbxghhP5wW zUJZ_`QpxvE0rLG@lT-6q8H5%?X-j{4MA|KsXH*J=7AB3W2YkSNogxI^62!wWt`N-+2J^wg&Szsi%JY|T)KJ3kMSp22C;t!YEY-`NoSIkK7 zZoHASVG$v~0Tx)&o%C6(=@!RC*~@GbuXc{J|Ms{8t-)>8OODIr3zwBB1Gs5dom;}! zW^u6k4)0Eh1^RQ9BB@X+GE@@X+>p2fqk*nvWzo!9YQe4kcD!8&{JM(d3Z48X{66dv zcj@IRA1)&EEb}-StL@Fza;wbXR!KtkXs*3;B^txCY8^#m)6N*vqQR56E0_~kGT&d@ zGSsTNl*ulrB4LPhh(t_e$$&sRPT&b&do9f_{@}w)aaZX6I!*K@yh*-fG+FujorWjA zu66)_63Bs0p_fpzH%(j0On=SWqWeUGCHI>v`WhmWTSPb3f=QA=NUpFFGxA6AfhTXg<*6Vw7F^RJfw8{NGCu z_PvCHxxFsmrO3!7i&(c8&!PeyP43+?4DbIQ7;76JC> z-WBPRPS@nVEs*f`u72q@;>k5hE|h3}!{aB0NeoX5bS0WOPU9S!&MDS1sO@)2kjTx6 zl-5=_7)#ulS!#4(XkM72XJ-zhVaP`SE~u@%u={daYxGXtRN#!RN+kmYv=;5{z$GN$6db8pbat zH{wTR3vHc@83QSpJL~#5AI6n7`E3`1*qQ9X{%{dcHa*bWjLbp(BF((5j~iI{%yY%J zxG7SmtRg4lA4`sFTSEd{6QkBy8o#yR+SFuAF!1;A*f^*Bf6M~@n}P73ag?IC40pd3 zrBOvp1UM3ekDZx`X1K;>=s7~!=At{ zZqV10-1*&E<=<#+*(x8(7in~?i3a-t7%xO}u6Vh*(jStYq(6i-ddw>xgG?5`NAm5ZM0fdXnm9}8>u@Y7 zbGz6IlhQ*(&@QuApH9~|v=8gdf7#xTC>gYgaD27Mjg1r4eO_;LCcnA_d14(f5%998 z>v0KjN&nV~dFdKpVb8e<1AbrSIXs2R=?;CHz9jVewh+&hOBLAzyKG)ZHc@f!?DV>R zsCsQeWwJ5=aK<|00vls6Cg4v(4=(SS_1W$F!a1aI0lsuaSO1(!#2wtJ{>o(XfDanA zzH)mhTtUZ6sjs{P2&fT=DuC=y+m!-IXu?OgWPm;Q=D@3Mja_E){X3fY%wIZlm*V!% z2&K~5L*^FVv~UWwf$g_j)LrLT(&xzGD|3A@epWF33_!U@XcCXnyA6t>Lu=Tl<1!st zd53wDSPU8K>H)Rz%IG;GD}WQABj)R>bi|mmzZsyO;Be@S`U>|BM#^VYguME|>acDW z-_t}2=;x&v_Q?MqpOTI30xRZawE?%)EaMEv5yXQUYH6_{#PBTtYH3GxoS-r4jwP#+Rr5@lw>9<4J^s z+MQdDAMlz^2w(!6kBFIDY~Kk{mCN`iCkXGN*<2tA(5#pW?%ZBEnNx{CaGkHBjRwe3 zNF<16%~QP4C-}?2cnUgG6iQ7Bu`GrH=^66GCK%p!&HwTS?5!MZqY3*l8Ws~C z;I9FXo}QcE;3=`&|Iy*6`*6#1Dyb9L^pNGWD&rkXznSfpc2Zx=+)x{msSPjloM?N? zuFi`@kyMBJ9|0rHUwp4M(8-{Wu-^)zs7Hk|JSr~hJq{{TzP-=$o+7qVBFZ4@R4}(O zSAL1J2{@u1Se~|TL^akH*Y%*d*`^#5WJ<`aVw@X=P5Jd9?}ZLhwXzSUT)aY)EPSGq z%})o)Rm?z%1%J{l;gXF=9%>!Y@!DM$12MXjz9|!h#+k#oECJlZ-rPMQ4$&?!RA2Yh zgt4r4ca$=fK8belYK6xc46<=z$8)_~Olk{a`nin%}sEV~!M-3vV>zsnUIyV5DmnVP0Rv5xq08o`8 zOJb|CpJ=)OE_p?Hm?gV9h`q~T<)KJzYwgEVp2RTkfq{XRC%7a}f3BWB-X&_EmtUxK zPsV4)`Uqowy~4GFy1rWe&i>TCa4oMvuu4wbLqQis(*xYcgAus8vr>%a&n){ zy}>Ma_F7I_WQV;6&xeOX)|lKP^JnZv-Rd!1eG^6~JcP@t!fdMkKsvrM9kmn?z|L0a zF(ugD;PH3U9al0jy^ZL@0N*mB?uH|75uqyB}$3Q1y^V1oxT^WVwLqN8HjNhWgfnj{Lg50@TQnR<}2RDd37kUx&j%V@liF$ODt|{ zJ>GCUHkx9`M(O=Q9k3R2u zKb#L|{m)v5Xr`oXSXIG;OW)ZIe+7(>mrDD@8VM^{eSf zB24dlPkuqn;HbaW0IIqCi?3D8BK`yc-0cg}{bXXP!g8s*o_#;I;u2^AsjsTFd}l29 zu>X89d2K#1>rPD(!a|gP8!P4{5c~U;*%!ttl_C|xykLEKW?foZ z%I~m6Ea?t9oN(~H|L3S06Ra~ekCuDt)`~-XExe1%z7ep@BZn{P@B@U>KZ zFk*f(3@MX|Qo7mMSpy>@+rrq#8jIW8G7b*Be5b`K6ErK}q3G-ImECKH&Ic0~2@s75d;UuasM`^5&tg#>B_75-mVQHGZqwK0cHaaJs)>4ud(U7EC`#mSuR8r<@h9 zOH_TnnTJNi@u3fPle}Ad5lRXMkOQWGRkQMMB*Wdndsi~TM8EJz4=s4 zhgb?|KYRAm}mQc;p+tA10;vvR?l5t;WDWe=9+_W&{Q@_(xh(lR$=5 zf191XkYR|2se?yG%VmQO3XVMGg0r2f-LFcyICqiIKEDVez#||4lP9OCNoG-zq*r&f zZRxz8?zeY(YIL~Tv%I>xxZqHQfPeDx3J4C)d=!#NV4+uN zw^@HMQ*wEEnZt2MlYmY0?^e`IY|+zg_;mm5{M?2K4u`u%?V%g>rM5IpO_A=F%_a-l zKMVt5rBLNy&ek$E7Uz7pI#BEGI&Hy6O{lkmw0Aa9rWsI$imJ9ZBqvNk*3Fg|L)sy7 zI_=d~>wfV71x0tIGv@5#qRehX;hR!!<16+WuyFU9e9@bhd0-0h9ooG4?Msd8MKvaD-answdH(ysIP4%Rp`leW61#&|TJxTB*ZGb_vbY)|*! zAm~i&eDm#fxd|gx46`mK3KeZ84ot;x)tW1el7ah>pLk=#fCA=w>2ka=aq*>;)EBTLx|8_A zwx=o%n{nm#IvCQ5b(@g>3>OD%#+?m2%7u`mdEG?%Y~w|TDkeiBBwyXv>Qq!Q4^VQw z{frYY&zh8LuT4bm-@ku}BOXHX0tCzcOKE9?$?wL~Xm{@3H6AM@*VWba_VHPWh>UDZ z6>&W~|5YU5e$K;33WLG4-1c8c=^vgZS@V-Qot>S{udK8n$oQ>39ISLHra!ySMn_NY zD+jxZZftxe*4x%;Pq1NywdG*@M2tU0Q!d-M)Od(qxVpN!@>gNi+2vs$F~8L#itWjA z8U_Zxk9Uz3x+)v&ZKL>#W^C(={+>h|ZU zu>Z8%_*7KHPReJ|yzPLChv)q}f?ujBmnoYIN;tH@9^I;#3IXFz?&6U_YpQSJKtpT# z{2i@n{$v$Nl#)C#-S4NV*~ffP&m#j)x9tGt%%Xx6Ovco9>)+pocsONnp{J-WY%HSorZ91N zFmHuFewa^zum^i|Da`YdW{pJDjUOa0BHyP;yyleyPelDxe9v^12?rIy+wXz&h8U96dMWK$Y>WTY~{rqvWmKT0i0Ca&>1qZ30* zYdcWcX+Van=W9xU+cTBNR#EgG>HvF*w1K6l`q}Pm4Y7~|D~&`bEf_yY9tZnvl(y^r zRJ}0?2?1?iOgkZs7`HA}2&3LkoAsK5o*V`Dt&rF?b(LlvUM?lasSE)$byv zKmcNP5dKO<`1hnNfsG;*hmx_Rtn8|If3^&1 zYcTQi5}71kPU}Un!NI}32N)RiV2>bEINb`9jG`|A>ka0+HKf;~0tB#_F&-Y?>+Y__ z7smW4vLLm=qdQ|*^ed)1Iy)B^w~jn4$vIbyuqIey@uX<{1+f>r>CdgU5m-tL$%0R7 z+eh?Q1Rpq559HACe45v(G#^*?{VbLZ|x|Gt)TLGYRsv2TO+^#P&q=5TIPi?^SjA}d%Dkh!gE zoLyZH_3)6%tBXX!1J*1+)K$xdupIP76MSPM{xw4}jtjI9NJi zhR4mxgdWuL%((phz^9e2I9qFYCT;$^0y&(7_9CCSy1E-$kJ~e37{04(+^a{%;wx*1 zQ=jf+C(--8Wm`1oO|`0mlXxsS9LAy)oi5qcLH1B--2>UeWxqC_9LsOE$u zH#e7-mUi9-&Ip={+N%={3<}|PIA~QsL0y?|@Pdv~FE<&;l*Ba|&F|<=;LZhs{A;Yp z=;rzgM54pav?M4MxtegU{r!D1AqTWS3+skbwRZdLD`lTdTHlvG(RTxjF|{!t>x+$!`$dKsh?acDEkshHaC@JjtTFLdZeG7l%xS(Tjh};PzCCtVM;o+NzDb4-2kY zqBmSKQ?=kSaS&w#tSp+H7k|1dNWNx5~xd5Ib#75A&*RCl!Mh#yDr;Gdqfj0!}gSXRRWqMov-1F2 zn3@Cup-!FOf+9V~R~e$GqVUZ8lpgio1zf4+bwXnD5#QoRls4QrYN9lW@raIPg>FCb z8f{ubF?Q-_?p6l$CA_@8>*M!ID}R2;$ROs_yGM99X*FIlZ)GJK zc9(sR-I$HAhm|0;O!X|Pt0krwuBlW0FX~d@J+pQ^GTWIXkZ>5f_$qs+gfq?dyN#*G zsS+jiw+sC)*t10=Zs*-Rn(@hycP2TM0jWfNDAxrIx3Wc7mdn>fsaVg^6Pqy?%f%Q# zHr$AgGMeI#q$;tOdcUD72&0xi&= zr>r+{sW%EI+bdGZ!p@NqG!lckiVPqt?5UO-pb!%i5ly-$-l=HQ(ULEd80o8t+AhNxsr7NJt&Snk09c3D8RF=@3{RfK2-vP#(Ue$) zyZ}9RJLOw8lPNPiTlh@%vW<08OCz^33(Oi(`$Khn$x6qu>R)mKE`X4SzlHsLGtp5o zb-<)tkRB4l9!4d&YCCw9c+h-nCF=euFbbMDKmm2sEgl>mB=WzVwY?Gp^U{O-Dm z_tUxe1xRC~dOh=|oynf>wl8{>ToGUT8TreYHq^^UC?SPfO!z&{$G}G*Yj9J4TV5g@ z4eq@3D!`E0GN#S83O$&9;zl;3+PfU#MRaY)LrG@b&@YdvkiZk$ie}V(A;dI|-xeRy zM10uG>re;tmG`{%KHBPO4khdT3I!C4A_x;HE}1A?wS?%=fP86C%B0>DsK=N#fWE{Q zA0OYE#s;pL+}9DskicV%1HxgrKqIcQlApq5ol2@yyaHAE2~gu`I5@()M&Dx%M8KO*NX52(;+2+iy^OzMIDf%_BdW&}A$qBC z`(m}`rP(ti3<)--APHPt%mNyXrRODgB3EUoM4LWJSm?1TE|Px_H4DMKVfjAy{v6S* zuTzJ@D%<^tg~i9aa-fg*`yNb;xKOYTe^(Me$Aiz6}NG20=-WD^% z&#%P64yF|*N6*3+w0t(U!6%sd`Rhl!qlIssot2A`4ShU+ zf}_NF$e`cMu*ca?&30CIG}$&uTJn2t`&vM zd`;irdz^_our*#~i~Xg-c8=?gqWdW%6oyMGYL^up6#hp`Q>RPgDNV5DGS6A*+H(7a zj~tK8xtSVz-p?cdKyrL-y(W=w$D1Yj;!!?vOxR_+2g6N)4f0PPy2Az`lw_*|Oo6Rb zKEIG3t{bBtw7uiv2v5SXpf;XI#)IuQlEEC}fooPM7k(NsS&@P;I3Rp*0Xr3FzdacP zvX4SO0K9hKXT9s|Yw0x66b%cw&#&$N^ykTaprTe@olL<&eRl@P%6R7IlQpSVua?9e z=j(5?sT8P}zn@DN!QaMj@aE3xn`gDtE1P(Lj-CaGm}nN2&@TJE`KN4gSD_D{agUZV zPCS()-ruLa?=vJAd}GDW*znZQkpAp!@i_{HlvQ|A)LqfqGb=VqYIVP;1S~l{HbR3s znos?~<*ZT;uNB1Ige9LYe8;%kIEkh8*t?x6X}t6us>Tm9U4U%N5(gs=M5(-etw!Fx zdpA&SsseF*v5}F_#tPp;7(rZrh2)}hDrv1ZdEr_02YXotc8!ASO@}2Lzy{o@N|ycd z@qN7s(LHBp><9Pmte|_YSEda#fbPoxM%j41sK%F)K8sV{S z?(PABfnOZ9C#B;#KBDFVYzc5Bz;5Bm$=!gMAH|nfA}M_r?25kB1utJ6Y!ENTI8ospHzRC5d%P0&w=)b)}XWB81w;rM^t!t{qa!` z-`pOceXI&yj=`cxU$ymlZ_C-<0U|UO#A0+>bvGE$0E-9M;7MwS}Qe$QP4^!&N?@m zmp$RqQHpGYIhB>nT3Yiq3)X%^9m&aL6sQ=h>Mj8LY|PdOfj&(az=G%_aAW;n(BYLxs<*G;is7L7I?|5KJx+*%=AS4buS&G6_Q+vHpaQOj{f&n;0k14!&OG`^D z`n$unIs`bu^_oLI8xLg*pN#86)HIaIB3P`c9|yTzAZaBf{v*0(ZTEyUths+9baTtZ z$Y`wEeAyPmh+a)VEwkqE4(cF3CPUQ^gMnY6C)004f(mwp1QN@_4lv8<8x3hzu2`=n zMzL+SMsm%(aAmIx9*%rVrV?UF)0P61BC|^FGtMTC_rsN(8ym*a;u)JwF$vDe zEaiaka@d`f0sDukV{R_ZkHW_eY0;hyYlLi9^_XL}ZBhvq~J?*lMmYN1mhf@hn4M|IQa<}I=4Gl`43^lKh zr)pPh_s63^6EQPsE({L=pg=&p$qq#iymkY7b{*YTU@2n<%>^slM2$g5(gufbH7?!exIzf^wihgAX9B1Yu_`uziKE z&z9USwky6{&ZR=@n^CM@0P&e@Z+}{y9~oaC#MSjzIa*S9URu{)>xr+|2AwG@dKy;dCbd_{)>>tFsDL-a^T&ljk(f^`59Kjsgg6Cf2t$zE$U^8P+dI zDSiaX!1Dr9^aO+|7OI!9sSi92R7Ar|6Ywr*?8+KY)4@ezY(hM>h^3|;yvoa7>+Xw7gthRnwFC@qPbb@-(QwNaxen<7rZ+>Awkl38}Q;?vBF95XOGTXdJT1c zacrHurgo`&rYU_-k~G|7hJ!;ei>l<OqVbDF3__ zrODQLSm&D}@LUsaqiG39VV=`DPZ-E>I)G@xb6rg^dOueya=6ylw(YP4F%P0wM~VRT zw0CzK419SZogx?mkhb~{vkp)>AR^=G)2DX3vndsG9!W)Y*NIT)k50Nk3*xQ;Pf7jwafqJjXud9B+N(j%Q3B1P?MS{_)c#W2 z5Fmc<+_?j>27vflJnVzDEd?;7eg>LHHRuRf)k^P$g^~+#0h$j2+JI)+2XY@WV8OC1 zW_|+xx5VYxL>R~)Yc59v62?G81EL9}6&@Yg1s1%miiK!l=r);^^V`AdL*vG0QHCn0 z+u4F2bPW(LHK(&(fY2YWu%raKC8&MY%k9_%tg7|F#N2!D2fo~guBTRJ7|pH?R9QzZ zpxKBbmT|#lp>tiH?SD5N3k}3)DfPVZ5WU=cKI^#hAFbC+c1yG667QPEv&+UoBaZ>>pbt~7*9_#`6!p`){en7ci}bzTMqRn&?wM%$Gpw zcn7`%`H9PF{vWW&;*t=FWm$7f;N#=NV=)~MbRP@6Igg9SMb!rnJAT?I#x*{PNvcnCIiYdvyqDdKN$af{ zxoA}OUXk9OG4{o!KcjeXsIJ|X`WLT9d^8a&oFV}MuhLapFP|RSiQ#fD+Am7@eV|Fn zlnHWn*Jit;>_KIO=9Tlw%lQdk9FWSG3KHvs*a+hQX5)OCEvc9jWzI`FrT~H&NP0Q6 zRWqT0e1%joz!}R|SiCjtOARqj1R@%@$uOfCFDW2=GCi)&osKp~f~u>92Zx4?`#;~# z5D)oc*prAx!sGuCpSl01y{USIg$$q(rz$KNV6e3Ca4hgb57+|xP9P8y1Z?Rk7-W;{ zLDL4Hw+$6goLclxwk9BnBNFs0$79-SZlINJ1#}ef9x$-8hb^^*;bLPq04Tn9c(}9_ z2FnIr_IHb!L?De$5id6`o{GqR|4v|ix)hnNeXcSz* zfDVpy*}K&iM&6P!SP+vdUq*mV!qco*GOtUdLxcphFe~`rkb;2AGKWf680^}=ZKBKw z*aQSYY01b0C@4w~toNEY2!AptmxD&?0UBC!1~_jt$WlyDeFFL>Tnzx=V(TSwu()jq zpjYmJ3<@aYGq`MuV2k6Nd)s!!oa{gU+*&IG=?-*}upkVwS+>hiRqM{OW8=?W~mKEw`wcYmbQ&CZEO_m3N_>V|Q2?6jHwDQ1`frLpR z4X95*RvYzyehP_0VDp2Kwtz|z|HPDlj@b7p)HQ--=Lgj-{h80heD(4`s^`8~goJHC zQvKaOMWh)`M7A7lpVEqo0wM2y)2$&ZeN|ST_x<7L=p>(v59EA5-X_zgwGm|k ztpEPmK^MC-h%QJ|fp8Qkcs%Bl(KW88ksuc;DB$eY-H1XNnLU@L9 z%SV?;l@%!-DO-0Q32o?J(>x6AZcxjo+u%izMnu7bX}>ErJk8VB)c9bzV>%cds`}H8 z>0JlNBTXR6UV;vZk?HYc^ti5;kwq*1_V)JApu>m;u#@+P#f+43GhHDKwe4fh0Tljl zZB&*q$?TTKuG_b(H+K6d4-PjRPgqx^qfA$3Y*xhkck=u$}U)Eu-Bkf2Q4HJa|ug9 zGyol|h4Ok2S@e9J2FP45Ioa9Sq1S+us0R*aYHx3UKb;oXC7_NC=!lr$?|})~0e(PL zSg@LxFVqz11udyA#r#&4&HAtA4Ft_}%E{uOS#{F%G0p^!TP<<)DX@J%Y zP_7;@UI0RyqV8g5cYUgY9rUcAy|A5gKOF#y2!+R)Zf~kckOWYQ89RX20dQ7K8(R}) zPGDC6y+aIAiWedh69a#1HJSOdFsU6lB*{N~k@EkukRTFh%2hqY_eXi4Q#8^!@?)^gkNEm}nh{F*z|&DOVOD)K_{s^QoS~sXj8h_? zWvB#*R%g&LSPP~=3`Df})2FvJDlAs`>JaF-^wQvtfa_^}t`0^BwW*L*4d_0ArCb5R zWtL)&?9ujA9I(qkI_3b_7rlUU(_Y{-9;5}#&pr{zoj?>K1JWmGputAlUk5T4G?Tu* zgW%nO^`ixnEa(9Ng$vSq3k@x;H$$2m4wy{=6_6PKy8yO$iD3^3RJ?(^ry2Amy@c9s z4UImi8Qjy?Y2ONf3wuOZu<- zK!xpi{`Rcv+T)Y$nY%Kq_IIXA$b^e2 z5yuc=0Cm4D;9fyaS~RicCtF?tO$RS;Ea=gwY&exIu;9K87b~6n9&j5TJGj3c|9jw0 z7~WWx>OMNu|5*p)OT-jC`vC9?kn5iVJ`&{eF94A`eFuUy01&T%6D*3~ZXFBUZWd2# zD0$al)+=H`J4R59R}^e)ZJhzlw*2IClsL;Lb0JXc|OqJ0Pkr*a=?hp8S5Fr9K z%MTu_f1d}i47x68N{4{(xKneg1yN(16;nOHE7IQ8wWR5JxkL$>W}f?^K~NAc3FavZ z@}|V^e94xkO9W7WB%oQcUJ>9D5j7XYKvDz#H>JX7?FBLW2c>)LAW?$G3u?Rmev=2F z9`w-sHtSdb(XX~IG=asTuCo9Y3flZ*Zyl{co7MX+ksj1lV8jDd7iSkKDuM4*^aB|+a4W@*p zf?fhZ8wq2GbpaW;1b9MuEoY@A0o4R;2*AQZNHCBN)Gi#HMqsCDoVz~Z3!Jg-6M+nA zW-~uyfcl>TV%`?G<{0%RcrLDXVWUg`!UHh@Gy(gh8t0Wg$+dEqo2WfcZ9ASa5T z1ti_Qd-ovE6F3+O$`%M*;K~U<^+G~F1705lFg-%h7i=X~?OL)h;9W&RBl-vMmja;S z3L<2OdPQJYg<4y-O!KK95C#UF)&lUQf%ruL4$_LB4DT1v`~j!dU{MhTsB(}Yn3$NH zra@Stk@5zE+I$E&$a(o(1v-zLi#dpRgsPB5)iy8Wy#x&p@H{L)Ow7(S99SzA@*Q_) z0nv?AH6tq}_0ZbdIx{nKejs0s8{DlZSJ7{IqE0yffb zktG6>L<@mIDLm;_jc>?AnJsc19;itWzW}<|_KuG9_^EAr1_tDcDH#wZz?G{h4J^Wd zSO9qfl%c(olUB$q2Ou1vE+9q$I2R*=a)DDDa&f~urZ*iFbH6^&zFrB|wQAH`h;L~e zfk<}XYf!DQAXiBOGD(C4h3@&$1{l-emlvoW=Nk;aw}II5CNPENb#S09uPPSl0t7hS zzz+Hpn}3-K$&$-Ux8G&#&y970I|db5545a+`2)rjr^NsUMn*;u)WAa?9Fx?~8RVl+ zfI2pa3A?O^2;xb|_X$B2fNF!u1R~Qs&QX5P3pV`c@0O(ysfh!Nsi4fL?_gX%46^Wc z#<7R_f!t@KR-g=+&=&9j;17*l5O0VFo9Qu&jaFA2` zHX?=-?QX;`U0_&;tfKyxk^e8<_WySb{SjOyeZA!VmxSnv<8;Vf{D}+fh|+rS)(~AQ)3%TIMophf)}ADuO`0myK6SN;9E&Jlc>8yPEF6@@ zJl;JM#GozKA{7oKLoDa)*4v-cj@CasQ!)M2Qbo2xI^#99GQXT1#%RhsyZ=Ch+2Y+! z;8i7K&HNsl@Fbim{WjZ=zNAius-QpK_XyIon52(#G%gZyI5gl$7sJVVNr_R`!+n^47W63qnWnbZ~` zM(;VEZRy$6dk^I@Z3OO^On11GQ-8J9;P|M_?<$z2pL>B=n3B1)T1Okxs4u9nG5rwJ zrB~47o3eh(LCC>M@QLL6T63$CRG0da$N8yw^M<9$!N4MqY-RpErF^NBy$3tadXLZv z`j#_jk@?8y4(^>BmRX+amdYveR+dUiPV{XI5B-VJ=y%E%b|GKZ2_qV!L%sZE7PL!C z+h0o3idsBOPY++1CwXOforXlk2b*I)-sg|1C0~=15J+o`+DI0u#;xnOy0kE@UwKfK z$5dNI$Yp!%p?UeLVS`LIbI0KD{NOCr!Aj9q-Z$BxZO~`ypMQfP)2z&<>9D~MwS$hv z>jnpJAS|BH50{wYQy7g`^9yeO&;&Ufwwr$cb(wv!ZqlcENdRm|8x5_GcK?e1M{^yI z+NCAp1*cHW8XX6f(LHRh!GKvjIVUsznnfD~gR3c$tiPd-0sn~GBW}8nD`mhI<-rBN z^tz((l}o7q%&U73u^bsu?9Vj7$tr8TCzl=}CKo{e&7SdTs3zBmIh81{FH?}BmDMrO zR=5G}&bC@Urlk)6=_QG(S*;VlZKy4$PY%}}Dta4Ra*?3z_#WGAkJCE<>x zvR7a&n{3*6-|7gZL^%gHP60(l{J6p3;Bm%aXUKGNc*B>vCFll*= zsV+?HGDpm7$uxz%u3dPRIy`il1k*h|S-2K5!7_V1 z-@GHks&+2o_mE%W{tkt3_=RQpqWobPZY3pQm8iQyo=PQYX!G~n*7soie2?A2d^CoFeA61l_NO5R{@BR& z$q@|!rFs}*b~3rW*ZjSe#;ws$W*FPE%?J2X0;`K@CU&H~`nQu*<7fQY7Ah8{68muG z{G3>I(78p&dyNAT{gt~9sO8uVHW!Dcx$|M^+Hxx?l;oE|uqTtE^;eF=tD`zBg*Avn6IfB(lbXg^=r}rH-{8GYx^S88+kOHDgCFir9r9MY zNOxw3Ow<3;^JE_B(Zk01o3pXQ>WoFKLq;@J|LDb6FA2_Yessqjn46UMU*=8lu#~+S zT8TQTEY(!ANYKb~b<;pZ`i9<1(vy+LmAd_;UaWqZ-Z|%vpR*&yIdadl=Vi@tg>!5F zCSn`o;kwOldGyv4`A^46=W4@HTWkF~doei|(k*yuvZ-#XBIH*IAxaH#1>HLrVkgDcwtFH!|1Q{71XL9_^&TqZ=;hBl_2L z>Fde@w^Ir1YSWX^e;ptae?}!Gy(-eG0j+W-?~4~Ngs+ZJR5j7+Wc(`oVlnna-Gc)%Qgijo`DUcajF#! zUSrJR#GSC@zgx((+|(=<3F|Zn5R6Y-cou);hU`)IGiEe< z#(00(8nl;wg&^Qy9Y&K zKNJ^Nl+tI2W-B-oc6(N5@Qn=!1@#+^ zR6(^S7fZ#8%)RRJp{p_*Mo~ii97e|57QgP)n&cShYv9pU;Jse+l1WC zI4-s?_$kHNToK*BJdvj^=&WvL-o9MtiX^2jqN=Y6+a`_WwmndaU90+d>pX*6U2xhjE{N!#@((UBsS>do3i06_o-?xxP!E)3M>h4Xh zup2cR^5vkuimz`sRX*4wUs5$*tGvAI$xrUE)}>(xFSZnX+xplLb7YH^f;-xmiIgY` ztK)#Ldm0PLHP&6Mmb7@S%zBoeSK$CygZeH-ZaQ&$-M?OsVvXb6?)!8_Ju7ltGCPfQUIjeAq-`_==>np;Lw*;mQS_FMBytjPM* z&-d0?n7^)O@t8g~Zn2Pkun<}p5q)h$k2<=$RyoL}Ot|tos)9cyW~#37RZL`o+g_S- z@UO{09S8YlILA=-ukCxQ44hX@2df?9?V!y)OX9gOP<$T^Hh$|ep(Rx z5q;lrf|1ohvEYjVvT>KA)u#mBx0Y@3Pm<`;w$~~n$@8_8(mv14N&59a&Szb{*Jh~f zae~iQD<3Iq*pbmZJs2;iaH{yY*qkRl)GRU(A!;i0v*P$*WBPtRTVbZU@rFn2^1IhP zH?eHZm7`qlFEH?x$|B&4BA31)nO%?3J2WhtH!-u+UPQaxwj_R`mdE()Pv{JC9hB)9 z9UkzFS6`yba^MbsLq*Zo);T}mSU=MCuar{55mL`B2v`jjmP$px(nKhx5^@h0g7$4 ze@N5$K`#pR4ZcWuJi8Bze;{f_XIA5xxhuT&wWR$_hZbS4&yZkCE*h%bF;3Z z`O!VB;H1tyg`O9=LEHzcMtjB=x6y8{j`0Y0+q4wKc24@3m<#UZdm~@yqLVi(76|xY z)7%^NTa^0d{MK(zL6JB?t)+QxG_-&C4W8}eiXY_))f*yYZfV-@x%0DxUa}T0Uu@!% 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�Pb)E-Vr2_}_XLvB!9 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 Ck4)(R diff --git a/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render with footer at the screen bottom.snap.png b/cypress/snapshots/cypress/component/DefaultLayout.cy.js/Default layout/ -- render with footer at the screen bottom.snap.png index a1a38b13c4a92d5f037fb843cc7c834d154ca35d..d8920bb8a146d9ea6813134c0d0e667d7af77a98 100644 GIT binary patch literal 58484 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 literal 38557 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 Sn8_9JQj$}bEqh=R@_zx|j>Dq> From cafebeb982f1a57d79a472cb71e3ef7d7054c8ca Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Tue, 28 Nov 2023 09:20:03 +0100 Subject: [PATCH 12/23] Adjust KC for itless env. --- src/auth/ITLessConnector/.eslintrc.js | 5 - src/auth/ITLessConnector/ITLessProvider.tsx | 108 ---------- src/auth/ITLessConnector/auth.ts | 216 -------------------- src/auth/OIDCConnector/OIDCProvider.tsx | 10 +- src/bootstrap.tsx | 3 +- 5 files changed, 7 insertions(+), 335 deletions(-) delete mode 100644 src/auth/ITLessConnector/.eslintrc.js delete mode 100644 src/auth/ITLessConnector/ITLessProvider.tsx delete mode 100644 src/auth/ITLessConnector/auth.ts diff --git a/src/auth/ITLessConnector/.eslintrc.js b/src/auth/ITLessConnector/.eslintrc.js deleted file mode 100644 index c3774b600..000000000 --- a/src/auth/ITLessConnector/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - rules: { - 'no-restricted-imports': 'off', - }, -}; diff --git a/src/auth/ITLessConnector/ITLessProvider.tsx b/src/auth/ITLessConnector/ITLessProvider.tsx deleted file mode 100644 index 895130ca9..000000000 --- a/src/auth/ITLessConnector/ITLessProvider.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { cogLogout, createUser, getEntitlements, getTokenWithAuthorizationCode, getUser, login, mapCogUserToChromeUser } from './auth'; -import ChromeAuthContext, { ChromeAuthContextValue } from '../ChromeAuthContext'; -import { initializeVisibilityFunctions } from '../../utils/VisibilitySingleton'; -import createGetUserPermissions from '../createGetUserPermissions'; -import { loadModulesSchema } from '../../redux/actions'; -import { useDispatch, useStore } from 'react-redux'; -import initializeAccessRequestCookies from '../initializeAccessRequestCookies'; -import { init } from '../../utils/iqeEnablement'; -import logger from '../logger'; -import AppPlaceholder from '../../components/AppPlaceholder'; -import { loadFedModules } from '../../utils/common'; -import { setCookie } from '../setCookie'; - -const authChannel = new BroadcastChannel('auth'); -const log = logger('ITLessProvider.tsx'); - -const ITLessProvider: React.FC = ({ children }) => { - const [cookieElement, setCookieElement] = useState(null); - const [state, setState] = useState({ - ready: false, - logout: () => { - cogLogout(); - }, - login: async () => { - login('your_username', 'your_password'); - }, - logoutAllTabs: () => { - authChannel.postMessage({ type: 'logout' }); - cogLogout(); - }, - loginAllTabs: () => { - authChannel.postMessage({ type: 'login' }); - }, - getUser: createUser, - getToken: getTokenWithAuthorizationCode, - user: { - entitlements: {}, - identity: { - type: '', - org_id: '', - }, - }, - token: '', - tokenExpires: 0, - doOffline: () => Promise.resolve(), - getOfflineToken: getTokenWithAuthorizationCode, - }); - - const store = useStore(); - const dispatch = useDispatch(); - - async function setupSSO() { - const { data: microFrontendConfig } = await loadFedModules(); - dispatch(loadModulesSchema(microFrontendConfig)); - initializeAccessRequestCookies(); - - const user = await getUser(); - const entitlementRes = await getEntitlements(); - const token = await getTokenWithAuthorizationCode(); - const chromeUser = mapCogUserToChromeUser(user, entitlementRes); - init(store, token); - setCookie(token, user.exp); - initializeVisibilityFunctions({ - getUser: createUser, - getToken: getTokenWithAuthorizationCode, - getUserPermissions: createGetUserPermissions(createUser, getTokenWithAuthorizationCode), - }); - authChannel.onmessage = (e) => { - if (e && e.data && e.data.type) { - log(`BroadcastChannel, Received event : ${e.data.type}`); - - // TODO: handle scopes - switch (e.data.type) { - case 'logout': - return cogLogout(); - case 'login': - return () => undefined; - case 'refresh': { - getTokenWithAuthorizationCode().then((token) => { - setState((prev) => ({ - ...prev, - token, - })); - }); - } - } - } - }; - setState((prev) => ({ - ...prev, - user: chromeUser, - ready: true, - token, - tokenExpires: user?.exp, - })); - } - useEffect(() => { - setupSSO(); - }, []); - - if (state.ready) { - return ; - } - return {children}; -}; - -export default ITLessProvider; diff --git a/src/auth/ITLessConnector/auth.ts b/src/auth/ITLessConnector/auth.ts deleted file mode 100644 index 9357afa4e..000000000 --- a/src/auth/ITLessConnector/auth.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { AuthenticationDetails, CognitoUser, CognitoUserPool, CognitoUserSession } from 'amazon-cognito-identity-js'; -import { getEnv } from '../../utils/common'; -import { isBeta } from '../../utils/common'; -import { ChromeUser } from '@redhat-cloud-services/types'; - -export interface CogUser { - auth_time: number; - client_id: string; - email: string; - event_id: string; - exp: number; - first_name: string; - iat: number; - id: string; - is_internal: boolean; - is_org_admin: boolean; - iss: string; - jti: string; - last_name: string; - locale: string; - org_id: string; - origin_jti: string; - scope: string; - sub: string; - token_use: string; - username: string; - version: number; - is_active?: boolean; -} - -async function fetchData() { - try { - const response = await fetch(`${isBeta() ? '/beta' : ''}/apps/chrome/env.json`); - const jsonData = await response.json(); - return jsonData; - } catch (error) { - console.log(error); - } -} - -function getSearchParams(url: string): { [key: string]: string } { - const searchString = new URL(url).search; - const searchParams = new URLSearchParams(searchString); - const searchParamsObject: { [key: string]: string } = {}; - for (const [key, value] of searchParams) { - searchParamsObject[key] = value; - } - return searchParamsObject; -} - -export async function getTokenWithAuthorizationCode() { - const code = getSearchParams(window.location.href).code; - const refreshToken = localStorage.getItem('REFRESH_TOKEN'); - - const data = await fetchData(); - const dataConfig = getEnv() === 'frh' ? data.poolData?.prod : getEnv() === 'frhStage' ? data.poolData?.stage : null; - const loginUrl = `${dataConfig?.ssoUrl}/login?client_id=${dataConfig?.ClientId}&response_type=code&scope=openid&redirect_uri=${dataConfig?.redirectUri}`; - - const redirectUri = dataConfig?.redirectUri; - if (!code && !refreshToken) { - localStorage.clear(); - window.location.href = loginUrl; - } - if (refreshToken) { - try { - const response = await fetch(`${dataConfig?.ssoUrl}/oauth2/token`, { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - body: `grant_type=refresh_token&client_id=${dataConfig?.ClientId}&refresh_token=${localStorage.getItem('REFRESH_TOKEN')}`, - }); - if (!response.ok) { - localStorage.clear(); - window.location.href = loginUrl; - throw new Error(`Request failed with status code ${response.status}`); - } - - const tokens = await response.json(); - - localStorage.setItem('ACCESS_TOKEN', tokens.access_token); - return tokens.access_token; - } catch (error) { - console.error(error); - } - } - try { - const response = await fetch(`${dataConfig?.ssoUrl}/oauth2/token`, { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - body: `grant_type=authorization_code&client_id=${dataConfig?.ClientId}&redirect_uri=${redirectUri}&code=${code}`, - }); - - if (!response.ok) { - throw new Error(`Request failed with status code ${response.status}`); - } - - const tokens = await response.json(); - localStorage.setItem('REFRESH_TOKEN', tokens.refresh_token); - localStorage.setItem('ACCESS_TOKEN', tokens.access_token); - return tokens.access_token; - } catch (error) { - console.error(error); - } -} - -export async function getUser(): Promise { - const token = localStorage.getItem('ACCESS_TOKEN'); - - const requestOptions = { - method: 'GET', - headers: { - Authorization: `Bearer ${token}`, - }, - }; - - try { - const response = await fetch('/api/identity/me', requestOptions); - if (!response.ok) { - throw new Error(`Request failed with status code: ${response.status}`); - } - return response.json(); - } catch (error) { - console.error(error); - throw error; - } -} - -export async function getEntitlements() { - const token = localStorage.getItem('ACCESS_TOKEN'); - - const requestOptions = { - method: 'GET', - headers: { - Authorization: `Bearer ${token}`, - }, - }; - - try { - const response = await fetch('/api/entitlements/v1/services', requestOptions); - if (!response.ok) { - throw new Error(`Request failed with status code: ${response.status}`); - } - return response.json(); - } catch (error) { - console.error(error); - throw error; - } -} - -export function mapCogUserToChromeUser(cogUser: CogUser, entitlements: ChromeUser['entitlements']): ChromeUser { - return { - identity: { - account_number: cogUser.org_id, - org_id: cogUser.org_id, - type: 'User', - user: { - username: cogUser.username, - email: cogUser.email, - first_name: cogUser.first_name, - last_name: cogUser.last_name, - is_active: cogUser?.is_active || true, - is_org_admin: cogUser.is_org_admin, - is_internal: cogUser.is_internal, - locale: cogUser.locale, - }, - internal: { - org_id: cogUser.org_id, - account_id: cogUser.id, - }, - }, - entitlements, - }; -} - -export async function createUser() { - const userRes = await getUser(); - const entitlementRes = await getEntitlements(); - - return mapCogUserToChromeUser(userRes, entitlementRes); -} - -export async function login(username: string, password: string) { - const data = await fetchData(); - return new Promise((resolve, reject) => { - const authenticationData = { - Username: username, - Password: password, - }; - const authenticationDetails = new AuthenticationDetails(authenticationData); - const userPool = new CognitoUserPool(data.poolData.stage); - const userData = { - Username: username, - Pool: userPool, - }; - const cognitoUser = new CognitoUser(userData); - cognitoUser.authenticateUser(authenticationDetails, { - onSuccess: function (result) { - resolve(result); - }, - onFailure: function (err) { - reject(err); - }, - }); - }); -} - -export async function cogLogout() { - const data = await fetchData(); - const dataConfig = getEnv() === 'frh' ? data.poolData?.prod : getEnv() === 'frhStage' ? data.poolData?.stage : null; - const loginUrl = `${dataConfig?.ssoUrl}/login?client_id=${dataConfig?.ClientId}&response_type=code&scope=openid&redirect_uri=${dataConfig?.redirectUri}`; - localStorage.clear(); - window.location.href = loginUrl; -} diff --git a/src/auth/OIDCConnector/OIDCProvider.tsx b/src/auth/OIDCConnector/OIDCProvider.tsx index 7b357afa3..3a86b77d5 100644 --- a/src/auth/OIDCConnector/OIDCProvider.tsx +++ b/src/auth/OIDCConnector/OIDCProvider.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useMemo, useState } from 'react'; -import { DEFAULT_SSO_ROUTES, loadFedModules } from '../../utils/common'; +import { DEFAULT_SSO_ROUTES, ITLess, isBeta, loadFedModules } from '../../utils/common'; import { AuthProvider, AuthProviderProps } from 'react-oidc-context'; import { WebStorageStateStore } from 'oidc-client-ts'; import platformUrl from '../platformUrl'; @@ -7,6 +7,8 @@ import { OIDCSecured } from './OIDCSecured'; import AppPlaceholder from '../../components/AppPlaceholder'; import { postbackUrlSetup } from '../offline'; +const betaPartial = isBeta() ? '/beta' : ''; + const OIDCProvider: React.FC = ({ children }) => { const [cookieElement, setCookieElement] = useState(null); const [state, setState] = useState< @@ -39,8 +41,8 @@ const OIDCProvider: React.FC = ({ children }) => { const authProviderProps: AuthProviderProps = useMemo( () => ({ - client_id: 'cloud-services', - silent_redirect_uri: `https://${window.location.host}/beta/apps/chrome/silent-check-sso.html`, + client_id: ITLess() ? 'console-dot' : 'cloud-services', + silent_redirect_uri: `https://${window.location.host}${betaPartial}/apps/chrome/silent-check-sso.html`, automaticSilentRenew: true, redirect_uri: `${window.location.origin}`, authority: `${state?.ssoUrl}`, @@ -50,7 +52,7 @@ const OIDCProvider: React.FC = ({ children }) => { authorization_endpoint: `${state?.ssoUrl}realms/redhat-external/protocol/openid-connect/auth`, token_endpoint: `${state?.ssoUrl}realms/redhat-external/protocol/openid-connect/token`, end_session_endpoint: `${state?.ssoUrl}realms/redhat-external/protocol/openid-connect/logout`, - check_session_iframe: `https://${window.location.host}/beta/apps/chrome/silent-check-sso.html`, + check_session_iframe: `https://${window.location.host}${betaPartial}/apps/chrome/silent-check-sso.html`, revocation_endpoint: `${state?.ssoUrl}realms/redhat-external/protocol/openid-connect/revoke`, }, // removes code_challenge query param from the url diff --git a/src/bootstrap.tsx b/src/bootstrap.tsx index c0a703dfa..0849854ed 100644 --- a/src/bootstrap.tsx +++ b/src/bootstrap.tsx @@ -9,13 +9,12 @@ import registerAnalyticsObserver from './analytics/analyticsObserver'; import { ITLess, getEnv, trustarcScriptSetup } from './utils/common'; import { ReduxState } from './redux/store'; import OIDCProvider from './auth/OIDCConnector/OIDCProvider'; -import ITLessProvider from './auth/ITLessConnector/ITLessProvider'; import messages from './locales/data.json'; import ErrorBoundary from './components/ErrorComponents/ErrorBoundary'; const isITLessEnv = ITLess(); const language: keyof typeof messages = 'en'; -const AuthProvider = isITLessEnv ? ITLessProvider : OIDCProvider; +const AuthProvider = OIDCProvider; const useInitializeAnalytics = () => { useEffect(() => { From a894df79ec5fa9f58ce32310fd45aed02c73def4 Mon Sep 17 00:00:00 2001 From: Aneela Chagarlamudi Date: Tue, 28 Nov 2023 08:37:29 -0500 Subject: [PATCH 13/23] Update sso url for prod itless --- src/utils/common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/common.ts b/src/utils/common.ts index 8624d4f18..aae68ae8f 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -39,7 +39,7 @@ export const DEFAULT_SSO_ROUTES = { }, frh: { url: ['console.openshiftusgov.com'], - sso: 'https://ocm-ra-prod-domain.auth-fips.us-gov-west-1.amazoncognito.com/login', + sso: 'https://sso.openshiftusgov.com', portal: 'https://console.openshiftusgov.com', }, ephem: { From 58c8ae8b29e06552206cb7a58197dec68b3e1e8c Mon Sep 17 00:00:00 2001 From: Bryan Florkiewicz Date: Thu, 30 Nov 2023 15:41:26 -0500 Subject: [PATCH 14/23] OIDC migration hot fix: fix stale user reference when using chrome utils See slack thread here: https://redhat-internal.slack.com/archives/C023VGW21NU/p1701356452137739 --- src/auth/OIDCConnector/OIDCSecured.tsx | 31 +++++++++++++++----------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/auth/OIDCConnector/OIDCSecured.tsx b/src/auth/OIDCConnector/OIDCSecured.tsx index 0d700779d..8d5b8503d 100644 --- a/src/auth/OIDCConnector/OIDCSecured.tsx +++ b/src/auth/OIDCConnector/OIDCSecured.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { hasAuthParams, useAuth } from 'react-oidc-context'; import { User } from 'oidc-client-ts'; import { BroadcastChannel } from 'broadcast-channel'; @@ -75,33 +75,34 @@ export function OIDCSecured({ setCookieElement, }: React.PropsWithChildren<{ microFrontendConfig: Record } & FooterProps>) { const auth = useAuth(); + const authRef = useRef(auth); const store = useStore(); const dispatch = useDispatch(); const [state, setState] = useState({ ready: false, logoutAllTabs: (bounce = true) => { authChannel.postMessage({ type: 'logout' }); - logout(auth, bounce); + logout(authRef.current, bounce); }, logout: () => { - logout(auth, true); + logout(authRef.current, true); }, - login: (requiredScopes) => login(auth, requiredScopes), + login: (requiredScopes) => login(authRef.current, requiredScopes), loginAllTabs: () => { authChannel.postMessage({ type: 'login' }); }, - getToken: () => Promise.resolve(auth.user?.access_token ?? ''), + getToken: () => Promise.resolve(authRef.current.user?.access_token ?? ''), getOfflineToken: () => getOfflineToken( - auth.settings.metadata?.token_endpoint ?? '', - auth.settings.client_id, - encodeURIComponent((auth.settings.metadata?.token_endpoint ?? '').split('#')[0]) + authRef.current.settings.metadata?.token_endpoint ?? '', + authRef.current.settings.client_id, + encodeURIComponent((authRef.current.settings.metadata?.token_endpoint ?? '').split('#')[0]) ), - doOffline: () => login(auth, ['offline_access'], prepareOfflineRedirect()), - getUser: () => Promise.resolve(mapOIDCUserToChromeUser(auth.user ?? {}, {})), - token: auth.user?.access_token ?? '', - tokenExpires: auth.user?.expires_at ?? 0, - user: mapOIDCUserToChromeUser(auth.user ?? {}, {}), + doOffline: () => login(authRef.current, ['offline_access'], prepareOfflineRedirect()), + getUser: () => Promise.resolve(mapOIDCUserToChromeUser(authRef.current.user ?? {}, {})), + token: authRef.current.user?.access_token ?? '', + tokenExpires: authRef.current.user?.expires_at ?? 0, + user: mapOIDCUserToChromeUser(authRef.current.user ?? {}, {}), }); const startChrome = async () => { @@ -169,6 +170,10 @@ export function OIDCSecured({ } }, [auth]); + useEffect(() => { + authRef.current = auth; + }, [auth]); + if (!auth.isAuthenticated || !state.ready) { return ; } From 0ddf9b17858adb0963200045817d72dfaaa42300 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 06:28:49 +0000 Subject: [PATCH 15/23] Bump @adobe/css-tools from 4.3.1 to 4.3.2 Bumps [@adobe/css-tools](https://github.com/adobe/css-tools) from 4.3.1 to 4.3.2. - [Changelog](https://github.com/adobe/css-tools/blob/main/History.md) - [Commits](https://github.com/adobe/css-tools/commits) --- updated-dependencies: - dependency-name: "@adobe/css-tools" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 83a405207..3700667ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -154,9 +154,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", - "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==", "dev": true }, "node_modules/@ampproject/remapping": { @@ -29296,9 +29296,9 @@ "dev": true }, "@adobe/css-tools": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", - "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==", "dev": true }, "@ampproject/remapping": { From 0fa923f875e5f6db15975d2ed627b712e7ded4c4 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Fri, 1 Dec 2023 10:17:13 +0100 Subject: [PATCH 16/23] Replace user object from redux by chrome auth context value. --- src/components/GlobalFilter/GlobalFilter.tsx | 5 +- .../GlobalFilter/GlobalFilterMenu.tsx | 7 +- src/components/Header/UserIcon.tsx | 9 +-- src/components/IDPChecker/IDPChecker.test.js | 77 ++++++++++++++----- src/components/IDPChecker/IDPChecker.tsx | 9 ++- .../DrawerPanelContent.tsx | 6 +- .../useQuickstartsStates.stage.test.js | 65 ++++++++++------ .../QuickStart/useQuickstartsStates.ts | 9 ++- src/components/RootApp/ScalprumRoot.test.js | 1 + src/hooks/useBundleVisitDetection.ts | 8 +- src/redux/chromeReducers.ts | 1 - src/redux/store.d.ts | 2 - 12 files changed, 128 insertions(+), 71 deletions(-) diff --git a/src/components/GlobalFilter/GlobalFilter.tsx b/src/components/GlobalFilter/GlobalFilter.tsx index 928a927bb..912106cb3 100644 --- a/src/components/GlobalFilter/GlobalFilter.tsx +++ b/src/components/GlobalFilter/GlobalFilter.tsx @@ -11,6 +11,7 @@ import { GlobalFilterTag, GlobalFilterWorkloads, ReduxState, SID } from '../../r import { FlagTagsFilter } from '../../@types/types'; import { isGlobalFilterAllowed } from '../../utils/common'; import InternalChromeContext from '../../utils/internalChromeContext'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; const useLoadTags = (hasAccess = false) => { const navigate = useNavigate(); @@ -128,7 +129,7 @@ const GlobalFilter = ({ hasAccess }: { hasAccess: boolean }) => { const GlobalFilterWrapper = () => { const [hasAccess, setHasAccess] = useState(false); const globalFilterRemoved = useSelector(({ globalFilter: { globalFilterRemoved } }: ReduxState) => globalFilterRemoved); - const userLoaded = useSelector(({ chrome: { user } }: ReduxState) => Boolean(user)); + const chromeAuth = useContext(ChromeAuthContext); const { pathname } = useLocation(); const { getUserPermissions } = useContext(InternalChromeContext); @@ -157,7 +158,7 @@ const GlobalFilterWrapper = () => { mounted = false; }; }, []); - return isGlobalFilterEnabled && userLoaded ? : null; + return isGlobalFilterEnabled && chromeAuth.ready ? : null; }; export default GlobalFilterWrapper; diff --git a/src/components/GlobalFilter/GlobalFilterMenu.tsx b/src/components/GlobalFilter/GlobalFilterMenu.tsx index 7d5220b44..1a5080c5b 100644 --- a/src/components/GlobalFilter/GlobalFilterMenu.tsx +++ b/src/components/GlobalFilter/GlobalFilterMenu.tsx @@ -1,4 +1,4 @@ -import React, { FormEvent, Fragment, MouseEventHandler, useMemo } from 'react'; +import React, { FormEvent, Fragment, MouseEventHandler, useContext, useMemo } from 'react'; import { Group, GroupFilter, GroupType } from '@redhat-cloud-services/frontend-components/ConditionalFilter'; import { useIntl } from 'react-intl'; @@ -18,6 +18,7 @@ import { CommonSelectedTag, ReduxState } from '../../redux/store'; import { updateSelected } from './globalFilterApi'; import { fetchAllTags } from '../../redux/actions'; import { FlagTagsFilter } from '../../@types/types'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; export type GlobalFilterMenuGroupKeys = GroupType; @@ -91,7 +92,7 @@ export const GlobalFilterDropdown: React.FunctionComponent undefined; const registeredWith = useSelector(({ globalFilter: { scope } }: ReduxState) => scope); - const userLoaded = useSelector(({ chrome: { user } }: ReduxState) => Boolean(user)); + const auth = useContext(ChromeAuthContext); const intl = useIntl(); const dispatch = useDispatch(); const GroupFilterWrapper = useMemo( @@ -102,7 +103,7 @@ export const GlobalFilterDropdown: React.FunctionComponent - {userLoaded && allowed !== undefined ? ( + {auth.ready && allowed !== undefined ? ( { - const username = useSelector(({ chrome }: ReduxState) => chrome.user?.identity.user?.username); + const auth = useContext(ChromeAuthContext); const [avatar, setAvatar] = useState(ImgAvatar); const getImage = (img: HTMLImageElement) => { @@ -17,7 +16,7 @@ const UserIcon = () => { useEffect(() => { const img = new Image(); - img.src = `https://access.redhat.com/api/users/avatar/${username}/`; + img.src = `https://access.redhat.com/api/users/avatar/${auth.user.identity.user?.username ?? ''}/`; img.onload = () => getImage(img); }, []); diff --git a/src/components/IDPChecker/IDPChecker.test.js b/src/components/IDPChecker/IDPChecker.test.js index 618e54161..eb0a35a10 100644 --- a/src/components/IDPChecker/IDPChecker.test.js +++ b/src/components/IDPChecker/IDPChecker.test.js @@ -6,6 +6,7 @@ import { act } from 'react-dom/test-utils'; import configureStore from 'redux-mock-store'; import * as utils from '../../utils/common'; import IDPChecker from './IDPChecker'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; jest.mock('../../utils/common', () => { const utils = jest.requireActual('../../utils/common'); @@ -48,11 +49,20 @@ describe('', () => { ITLessSpy.mockReturnValueOnce(false); const store = mockStore(initialState); const { container, queryAllByTestId } = render( - - - OK - - + + + + OK + + + ); expect(queryAllByTestId('foo')).toHaveLength(1); @@ -69,11 +79,20 @@ describe('', () => { await act(async () => { render( - - - OK - - + + + + OK + + + ); }); @@ -94,11 +113,20 @@ describe('', () => { await act(async () => { render( - - - OK - - + + + + OK + + + ); }); @@ -111,11 +139,20 @@ describe('', () => { await act(async () => { render( - - - OK - - + + + + OK + + + ); }); diff --git a/src/components/IDPChecker/IDPChecker.tsx b/src/components/IDPChecker/IDPChecker.tsx index 2dfaa79f9..2c8af73db 100644 --- a/src/components/IDPChecker/IDPChecker.tsx +++ b/src/components/IDPChecker/IDPChecker.tsx @@ -1,10 +1,11 @@ -import React, { Fragment, useEffect, useRef, useState } from 'react'; +import React, { Fragment, useContext, useEffect, useRef, useState } from 'react'; import axios from 'axios'; import { useSelector } from 'react-redux'; import { ITLess } from '../../utils/common'; import IDPError from '../ErrorComponents/IDPError'; import { ReduxState } from '../../redux/store'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; const IDPStatuses = { OK: 'OK', @@ -22,11 +23,11 @@ const IDPChecker: React.FunctionComponent = ({ children } return IDPStatuses.OK; }); - const hasUser = useSelector(({ chrome: { user } }: ReduxState) => Object.keys(user || {}).length > 0); + const auth = useContext(ChromeAuthContext); const allowStateChange = useRef(ITLessEnv); useEffect(() => { - if (ITLessEnv && status !== IDPStatuses.PENDING && hasUser) { + if (ITLessEnv && status !== IDPStatuses.PENDING && auth.ready) { allowStateChange.current && setStatus(IDPStatuses.PENDING); axios .get('/api/entitlements/v1/services') @@ -38,7 +39,7 @@ const IDPChecker: React.FunctionComponent = ({ children allowStateChange.current && setStatus(authError ? IDPStatuses.ERROR : IDPStatuses.OK); }); } - }, [hasUser, missingIDP]); + }, [auth.ready, missingIDP]); useEffect(() => { if (missingIDP === true) { diff --git a/src/components/NotificationsDrawer/DrawerPanelContent.tsx b/src/components/NotificationsDrawer/DrawerPanelContent.tsx index 936fddaad..2cc83af28 100644 --- a/src/components/NotificationsDrawer/DrawerPanelContent.tsx +++ b/src/components/NotificationsDrawer/DrawerPanelContent.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import { PopoverPosition } from '@patternfly/react-core/dist/dynamic/components/Popover'; import { Icon } from '@patternfly/react-core/dist/dynamic/components/Icon'; import { Badge } from '@patternfly/react-core/dist/dynamic/components/Badge'; @@ -28,6 +28,7 @@ import { NotificationData, ReduxState } from '../../redux/store'; import NotificationItem from './NotificationItem'; import { markAllNotificationsAsRead, markAllNotificationsAsUnread, toggleNotificationsDrawer } from '../../redux/actions'; import { filterConfig } from './notificationDrawerUtils'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; export type DrawerPanelProps = { innerRef: React.Ref; @@ -63,7 +64,8 @@ const DrawerPanelBase = ({ innerRef }: DrawerPanelProps) => { const navigate = useNavigate(); const dispatch = useDispatch(); const notifications = useSelector(({ chrome: { notifications } }: ReduxState) => notifications?.data || []); - const isOrgAdmin = useSelector(({ chrome }: ReduxState) => chrome.user?.identity.user?.is_org_admin); + const auth = useContext(ChromeAuthContext); + const isOrgAdmin = auth?.user?.identity?.user?.is_org_admin; useEffect(() => { const modifiedNotifications = (activeFilters || []).reduce( diff --git a/src/components/QuickStart/useQuickstartsStates.stage.test.js b/src/components/QuickStart/useQuickstartsStates.stage.test.js index 66bf8db51..8a50f9622 100644 --- a/src/components/QuickStart/useQuickstartsStates.stage.test.js +++ b/src/components/QuickStart/useQuickstartsStates.stage.test.js @@ -5,6 +5,7 @@ import { Provider } from 'react-redux'; import * as axios from 'axios'; import useQuickstartsStates from './useQuickstartsStates'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; jest.mock('axios', () => { const axios = jest.requireActual('axios'); @@ -26,26 +27,27 @@ jest.mock('../../utils/common', () => { }; }); -describe('useQuickstartsStates stage', () => { - const getSpy = jest.spyOn(axios.default, 'get'); - const postSpy = jest.spyOn(axios.default, 'post'); - const accountStore = createStore(() => ({ - chrome: { - user: { - identity: { - internal: { - account_id: 666, - }, - }, +const mockChromeContextValue = { + user: { + identity: { + internal: { + account_id: 666, }, }, - })); + }, + ready: true, +}; - const emptyStore = createStore(() => ({ - chrome: { - user: undefined, - }, - })); +const emptyStore = createStore(() => ({})); +const WrapperComponent = ({ children, store = emptyStore, contextValue = mockChromeContextValue }) => ( + + {children} + +); + +describe('useQuickstartsStates stage', () => { + const getSpy = jest.spyOn(axios.default, 'get'); + const postSpy = jest.spyOn(axios.default, 'post'); afterEach(() => { getSpy.mockReset(); @@ -53,7 +55,7 @@ describe('useQuickstartsStates stage', () => { }); test('should not call API if no account Id exists', () => { - const wrapper = ({ children }) => {children}; + const wrapper = ({ children }) => {children}; const { result } = renderHook(() => useQuickstartsStates(), { wrapper }); @@ -64,7 +66,7 @@ describe('useQuickstartsStates stage', () => { test('should call quickstarts progress API if account id exists', async () => { getSpy.mockImplementationOnce(() => Promise.resolve({ data: { data: [] } })); - const wrapper = ({ children }) => {children}; + const wrapper = ({ children }) => {children}; let result; await act(async () => { const { result: resultInternal } = renderHook(() => useQuickstartsStates(), { wrapper }); @@ -91,7 +93,7 @@ describe('useQuickstartsStates stage', () => { }) ); - const wrapper = ({ children }) => {children}; + const wrapper = ({ children }) => {children}; let result; await act(async () => { const { result: resultInternal } = renderHook(() => useQuickstartsStates(), { wrapper }); @@ -108,7 +110,7 @@ describe('useQuickstartsStates stage', () => { }); test('should set active quickstart id', () => { - const wrapper = ({ children }) => {children}; + const wrapper = ({ children }) => {children}; const { result } = renderHook(() => useQuickstartsStates(), { wrapper }); @@ -119,7 +121,7 @@ describe('useQuickstartsStates stage', () => { }); test('should set quickstarts states from object', () => { - const wrapper = ({ children }) => {children}; + const wrapper = ({ children }) => {children}; const { result } = renderHook(() => useQuickstartsStates(), { wrapper }); @@ -130,7 +132,7 @@ describe('useQuickstartsStates stage', () => { }); test('should set quickstarts states from function', async () => { - const wrapper = ({ children }) => {children}; + const wrapper = ({ children }) => {children}; const { result } = renderHook(() => useQuickstartsStates(), { wrapper }); @@ -147,7 +149,22 @@ describe('useQuickstartsStates stage', () => { progress: 'updated-state', }) ); - const wrapper = ({ children }) => {children}; + const wrapper = ({ children }) => ( + + {children} + + ); const { result } = renderHook(() => useQuickstartsStates(), { wrapper }); diff --git a/src/components/QuickStart/useQuickstartsStates.ts b/src/components/QuickStart/useQuickstartsStates.ts index f52147de3..3377bacba 100644 --- a/src/components/QuickStart/useQuickstartsStates.ts +++ b/src/components/QuickStart/useQuickstartsStates.ts @@ -1,13 +1,14 @@ import axios from 'axios'; -import { useEffect, useState } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; +import { useContext, useEffect, useState } from 'react'; +import { useDispatch } from 'react-redux'; import { QuickStart, QuickStartState } from '@patternfly/quickstarts'; -import { ReduxState } from '../../redux/store'; import { populateQuickstartsCatalog } from '../../redux/actions'; +import ChromeAuthContext from '../../auth/ChromeAuthContext'; const useQuickstartsStates = () => { const dispatch = useDispatch(); - const accountId = useSelector(({ chrome }: ReduxState) => chrome?.user?.identity?.internal?.account_id); + const auth = useContext(ChromeAuthContext); + const accountId = auth.user.identity?.internal?.account_id; const [allQuickStartStates, setAllQuickStartStatesInternal] = useState<{ [key: string | number]: QuickStartState }>({}); const [activeQuickStartID, setActiveQuickStartIDInternal] = useState(''); diff --git a/src/components/RootApp/ScalprumRoot.test.js b/src/components/RootApp/ScalprumRoot.test.js index 44fcdb7e1..3bc2588a0 100644 --- a/src/components/RootApp/ScalprumRoot.test.js +++ b/src/components/RootApp/ScalprumRoot.test.js @@ -56,6 +56,7 @@ describe('ScalprumRoot', () => { getToken() { return Promise.resolve('a.a'); }, + ready: true, user: { identity: { account_number: '0', diff --git a/src/hooks/useBundleVisitDetection.ts b/src/hooks/useBundleVisitDetection.ts index eca75f3bb..2d72c98d6 100644 --- a/src/hooks/useBundleVisitDetection.ts +++ b/src/hooks/useBundleVisitDetection.ts @@ -1,10 +1,9 @@ -import { useEffect, useMemo } from 'react'; +import { useContext, useEffect, useMemo } from 'react'; import { useLocation } from 'react-router-dom'; import { VisitedBundles, useVisitedBundles } from '@redhat-cloud-services/chrome'; import axios from 'axios'; -import { useSelector } from 'react-redux'; -import { ReduxState } from '../redux/store'; import { getUrl } from './useBundle'; +import ChromeAuthContext from '../auth/ChromeAuthContext'; // TMP Insights specific trigger const shouldSendVisit = (bundle: string, visits: VisitedBundles) => bundle === 'insights' && !visits[bundle]; @@ -18,7 +17,8 @@ const sendVisitedBundle = async (orgId: string) => { const useBundleVisitDetection = () => { const { pathname } = useLocation(); - const orgId = useSelector(({ chrome: { user } }: ReduxState) => user?.identity?.org_id); + const auth = useContext(ChromeAuthContext); + const orgId = auth.user?.identity?.org_id; const { markVisited, visitedBundles, initialized } = useVisitedBundles(); const bundle = useMemo(() => getUrl('bundle'), [pathname]); useEffect(() => { diff --git a/src/redux/chromeReducers.ts b/src/redux/chromeReducers.ts index d01f3e627..8fb974ecc 100644 --- a/src/redux/chromeReducers.ts +++ b/src/redux/chromeReducers.ts @@ -25,7 +25,6 @@ export function loginReducer(state: ChromeState, { payload }: { payload: ChromeU return { ...state, missingIDP, - user: payload, }; } diff --git a/src/redux/store.d.ts b/src/redux/store.d.ts index beff48101..734f03bd8 100644 --- a/src/redux/store.d.ts +++ b/src/redux/store.d.ts @@ -1,5 +1,4 @@ import { QuickStart } from '@patternfly/quickstarts'; -import { ChromeUser } from '@redhat-cloud-services/types'; import { ChromeModule, FlagTagsFilter, NavItem, Navigation, RouteDefinition } from '../@types/types'; import { ThreeScaleError } from '../utils/responseInterceptors'; @@ -48,7 +47,6 @@ export type ChromeState = { */ appId?: string; missingIDP?: boolean; - user?: ChromeUser; pageAction?: string; pageObjectId?: string; modules?: { [key: string]: ChromeModule }; From 068400bc42efa48c7e540631d41fc8f30df87eff Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Mon, 4 Dec 2023 09:37:16 +0100 Subject: [PATCH 17/23] Ensure platform URL will always end with trailing / --- src/auth/OIDCConnector/OIDCProvider.tsx | 4 +--- src/auth/platformUrl.test.ts | 8 +++++--- src/auth/platformUrl.ts | 12 +++++++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/auth/OIDCConnector/OIDCProvider.tsx b/src/auth/OIDCConnector/OIDCProvider.tsx index 3a86b77d5..218bc3def 100644 --- a/src/auth/OIDCConnector/OIDCProvider.tsx +++ b/src/auth/OIDCConnector/OIDCProvider.tsx @@ -26,9 +26,7 @@ const OIDCProvider: React.FC = ({ children }) => { config: { ssoUrl }, }, } = data; - // add trailing slash if missing - const sanitizedSSOUrl = `${ssoUrl.replace(/\/$/, '')}/`; - setState({ ssoUrl: platformUrl(DEFAULT_SSO_ROUTES, sanitizedSSOUrl), microFrontendConfig: data }); + setState({ ssoUrl: platformUrl(DEFAULT_SSO_ROUTES, ssoUrl), microFrontendConfig: data }); } catch (error) { setState({ ssoUrl: platformUrl(DEFAULT_SSO_ROUTES), microFrontendConfig: data }); } diff --git a/src/auth/platformUrl.test.ts b/src/auth/platformUrl.test.ts index d06f7d9bd..02f985989 100644 --- a/src/auth/platformUrl.test.ts +++ b/src/auth/platformUrl.test.ts @@ -17,7 +17,7 @@ describe('platformUrl', () => { it('should return dev sso url if env is set to console.dev', () => { window.location.hostname = 'console.dev.redhat.com'; const ssourl = platformUrl(DEFAULT_SSO_ROUTES); - expect(ssourl).toBe(DEFAULT_SSO_ROUTES.dev.sso); + expect(ssourl).toBe(DEFAULT_SSO_ROUTES.dev.sso + '/'); // don't forget to reset the hostname for other tests window.location.hostname = ''; }); @@ -25,7 +25,7 @@ describe('platformUrl', () => { it('should return custom sso url if provided', () => { const customSsoUrl = 'https://custom.sso.url'; const ssourl = platformUrl(DEFAULT_SSO_ROUTES, customSsoUrl); - expect(ssourl).toBe(customSsoUrl); + expect(ssourl).toBe(customSsoUrl + '/'); }); // test for all envs using the DEFAULT_SSO_ROUTES @@ -34,7 +34,9 @@ describe('platformUrl', () => { it(`should return ${env} sso url if env is set to ${url}`, () => { window.location.hostname = url; const ssourl = platformUrl(DEFAULT_SSO_ROUTES); - expect(ssourl).toBe(DEFAULT_SSO_ROUTES[env as keyof typeof DEFAULT_SSO_ROUTES].sso); + expect(ssourl).toMatch(new RegExp(DEFAULT_SSO_ROUTES[env as keyof typeof DEFAULT_SSO_ROUTES].sso)); + // Must always end with trailing slash + expect(ssourl).toMatch(/\/$/); // don't forget to reset the hostname for other tests window.location.hostname = ''; }); diff --git a/src/auth/platformUrl.ts b/src/auth/platformUrl.ts index da904b6a3..617afa177 100644 --- a/src/auth/platformUrl.ts +++ b/src/auth/platformUrl.ts @@ -2,15 +2,21 @@ import { DEFAULT_SSO_ROUTES } from '../utils/common'; import logger from './logger'; const log = logger('auth/platform.ts'); +// add trailing slash if missing +function sanitizeUrl(url: string) { + return `${url.replace(/\/$/, '')}/`; +} + // Parse through keycloak options routes export default function platformUlr(env: typeof DEFAULT_SSO_ROUTES, configSsoUrl?: string) { // we have to use hard coded value for console.dev.redhat.com // ugly hack + if (location.hostname === 'console.dev.redhat.com') { - return DEFAULT_SSO_ROUTES.dev.sso; + return sanitizeUrl(DEFAULT_SSO_ROUTES.dev.sso); } if (configSsoUrl) { - return configSsoUrl; + return sanitizeUrl(configSsoUrl); } const ssoEnv = Object.entries(env).find(([, { url }]) => url.includes(location.hostname)); @@ -18,7 +24,7 @@ export default function platformUlr(env: typeof DEFAULT_SSO_ROUTES, configSsoUrl if (ssoEnv) { log(`SSO Url: ${ssoEnv?.[1].sso}`); log(`Current env: ${ssoEnv?.[0]}`); - return ssoEnv?.[1].sso; + return sanitizeUrl(ssoEnv?.[1].sso); } else { log('SSO url: not found, defaulting to qa'); log('Current env: not found, defaulting to qa'); From 5a8287e87d5c9b8dbd34c08c174135634cb1d3a7 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Mon, 4 Dec 2023 09:56:07 +0100 Subject: [PATCH 18/23] Increase interval for hiding pendo badge on landing page. --- src/hooks/useDisablePendoOnLanding.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/hooks/useDisablePendoOnLanding.ts b/src/hooks/useDisablePendoOnLanding.ts index d47a00e7b..0ee17c218 100644 --- a/src/hooks/useDisablePendoOnLanding.ts +++ b/src/hooks/useDisablePendoOnLanding.ts @@ -1,14 +1,13 @@ import { useEffect } from 'react'; import { useSelector } from 'react-redux'; import { ReduxState } from '../redux/store'; -import { isProd } from '../utils/common'; import { isITLessEnv } from '../utils/consts'; // interval timing is short because we want to catch the bubble before ASAP so it does not cover the VA button -const RETRY_ATTEMPS = 500; +const RETRY_ATTEMPS = 2000; const RETRY_INTERVAL = 50; -function retry(fn: () => void, retriesLeft = 10, interval = 100) { +function retry(fn: () => void, retriesLeft = 50, interval = 100) { try { return fn(); } catch (error) { @@ -64,7 +63,7 @@ const useDisablePendoOnLanding = () => { } return () => { - if (interval && !isProd() && !isITLessEnv) { + if (interval && !isITLessEnv) { clearInterval(interval); } }; From 2a0a9b659e3a825172de2b33877ea864c8d49a5b Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Tue, 14 Nov 2023 11:54:11 +0100 Subject: [PATCH 19/23] Update dependencies. --- package-lock.json | 260 ++++++++++-------- package.json | 1 + .../Header/HeaderTests/ToolbarToggle.test.js | 36 ++- .../__snapshots__/HeaderAlert.test.js.snap | 4 +- .../__snapshots__/ToolbarToggle.test.js.snap | 6 +- .../__snapshots__/UserToggle.test.js.snap | 6 +- .../__snapshots__/Navigation.test.js.snap | 10 +- 7 files changed, 193 insertions(+), 130 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3700667ae..07373a298 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "classnames": "^2.3.2", "commander": "^10.0.0", "history": "^5.3.0", + "jotai": "^2.5.1", "js-cookie": "^3.0.1", "js-yaml": "^4.1.0", "localforage": "^1.10.0", @@ -4252,28 +4253,38 @@ } }, "node_modules/@patternfly/react-component-groups": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@patternfly/react-component-groups/-/react-component-groups-1.0.17.tgz", - "integrity": "sha512-SeTnlmEyk9q/TxnLs2WCNuEhpD9iKdgArW+OnW6O/rm/VDtPAeJ7O+SYT0JeZDqtNzMvAb9D02GE06k+5urchQ==", + "version": "5.0.0-prerelease.6", + "resolved": "https://registry.npmjs.org/@patternfly/react-component-groups/-/react-component-groups-5.0.0-prerelease.6.tgz", + "integrity": "sha512-xqcq3BUuk5ISpBuYDhUBalAz7SV3T5KNhM7pI4RG66Av7S7l5qRGjWJr83beLSb5rN3lbQEDhFGBWkBBuZjShw==", "dependencies": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-icons": "^5.0.0", - "react-jss": "^10.9.2" + "@patternfly/react-core": "^5.1.1", + "@patternfly/react-icons": "^5.1.1", + "@patternfly/react-table": "^5.1.1", + "clsx": "^2.0.0", + "react-jss": "^10.10.0" }, "peerDependencies": { "react": "^17 || ^18", "react-dom": "^17 || ^18" } }, + "node_modules/@patternfly/react-component-groups/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/@patternfly/react-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.0.1.tgz", - "integrity": "sha512-Eevd+8ACLFV733J+cpo4FRgNtRBObIgmUcrqLjf9H99jZ1hFpBgacFyHiALFi2cuoNVGmdEzskFl+4c7Uo0n+w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.1.1.tgz", + "integrity": "sha512-9DbgQMXYmF8A4aCNLKXwIN1H07SIPoPaVLvx+yiDuJfDx4Qi0T+H7j5cx0VfDfxuCpqea3POJWqBQn1HnwS4wQ==", "dependencies": { - "@patternfly/react-icons": "^5.0.1", - "@patternfly/react-styles": "^5.0.1", - "@patternfly/react-tokens": "^5.0.1", - "focus-trap": "7.4.3", + "@patternfly/react-icons": "^5.1.1", + "@patternfly/react-styles": "^5.1.1", + "@patternfly/react-tokens": "^5.1.1", + "focus-trap": "7.5.2", "react-dropzone": "^14.2.3", "tslib": "^2.5.0" }, @@ -4283,29 +4294,28 @@ } }, "node_modules/@patternfly/react-icons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.0.1.tgz", - "integrity": "sha512-MduetDRzve3eRlKAioM/UxmVuPyFccdeBWAKhbN4SBn7RaZWS7kO7/xZzNkpeT5pqQIeAACvz3uiV2/3uAf38w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.1.1.tgz", + "integrity": "sha512-9gCxkWz2xcdi0rtXu2F0L68w4tLIlsgGTACo1ggr4aVng9jRX++o1PlCOqscOd9o0NiFnFD7BLlZUGvJWaYEZg==", "peerDependencies": { "react": "^17 || ^18", "react-dom": "^17 || ^18" } }, "node_modules/@patternfly/react-styles": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.0.1.tgz", - "integrity": "sha512-kHP/lbvmhBnNfWiqJJLNwOQZnkcl6wfwAesRp22s4Lj941EWe0oFIqn925/uORIOAOz2du1121t7T4UTfLZg4w==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.1.1.tgz", + "integrity": "sha512-swO9X+WixYYDsMVsEJp1V8QUfhEQY91QfFm4phfYP4jc2TQ2opIFYdUIHkc+yrZwBhrgb/pPUUfemyqAoSbZcA==" }, "node_modules/@patternfly/react-table": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.0.0.tgz", - "integrity": "sha512-Q3MBo9+ZmBvLJzVHxmV9f/4qQAz5Si743zVLHRwjh+tjbn/DrcbxJdT8Uxa3NGKkpvszzgi/LPeXipJOHOELug==", - "peer": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.1.1.tgz", + "integrity": "sha512-9tAtHj16hemJ6YRBWIm2O+QRNoFWYQt8ZLQ1G0KBwpg2t2G2CbGsS2RG+BamO4IVE6IPo3Yoo39p4UCNRiGVpA==", "dependencies": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-icons": "^5.0.0", - "@patternfly/react-styles": "^5.0.0", - "@patternfly/react-tokens": "^5.0.0", + "@patternfly/react-core": "^5.1.1", + "@patternfly/react-icons": "^5.1.1", + "@patternfly/react-styles": "^5.1.1", + "@patternfly/react-tokens": "^5.1.1", "lodash": "^4.17.19", "tslib": "^2.5.0" }, @@ -4315,9 +4325,9 @@ } }, "node_modules/@patternfly/react-tokens": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.0.1.tgz", - "integrity": "sha512-YafAGJYvxDP4GaQ0vMybalWmx7MJ+etUf1cGoaMh0wRD2eswltT/RckygtEBKR/M61qXbgG+CxKmMyY8leoiDw==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.1.1.tgz", + "integrity": "sha512-cHuNkzNA9IY9aDwfjSEkitQoVEvRhOJRKhH0yIRlRByEkbdoV9jJZ9xj20hNShE+bxmNuom+MCTQSkpkN1bV8A==" }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", @@ -4489,15 +4499,15 @@ } }, "node_modules/@redhat-cloud-services/frontend-components": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.0.10.tgz", - "integrity": "sha512-xYgHwtpkPYXXByMizbraIm+M9WXS65FDwA4wIJq/hzOAiVv4WtORVCRn3Ysul3wAKlXLB9Q+M6kzxXXcbc+v4g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.1.0.tgz", + "integrity": "sha512-IsQf/DK5nA+ARFdq25o5Ndi2EAE5cgkDA80GjK3CluTvV+0ve5wRCtD/nCnVbRs9i/CbSAu8YTCvLA6tCTUKyA==", "dependencies": { - "@patternfly/react-component-groups": "^1.0.17", + "@patternfly/react-component-groups": "^5.0.0-prerelease.5", "@redhat-cloud-services/frontend-components-utilities": "^4.0.0", "@redhat-cloud-services/types": "^0.0.24", - "@scalprum/core": "^0.5.1", - "@scalprum/react-core": "^0.5.1", + "@scalprum/core": "^0.5.4", + "@scalprum/react-core": "^0.5.4", "sanitize-html": "^2.7.2" }, "peerDependencies": { @@ -4599,12 +4609,12 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-notifications": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-4.0.2.tgz", - "integrity": "sha512-xivlLFmlAhn+WNwaKuHXXQhSeVW+EkuApAErhvYanC5SZ32H9cIzp4aF61ZoLv7A1pjTSu/QcZ+BxvfTKCNrUQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-4.1.0.tgz", + "integrity": "sha512-bEoAeZMVY+UuSriSeruZ1pIesiPEjScrVFJQ5Wq/w3UFc79oXSYOgpRElxblPUH/LbKqp7inbzqRm2FxMcVxYg==", "dependencies": { - "@redhat-cloud-services/frontend-components": "^4.0.0", - "@redhat-cloud-services/frontend-components-utilities": "^4.0.0", + "@redhat-cloud-services/frontend-components": "^4.0.9", + "@redhat-cloud-services/frontend-components-utilities": "^4.0.2", "redux-promise-middleware": "6.1.3" }, "peerDependencies": { @@ -15050,11 +15060,11 @@ "dev": true }, "node_modules/focus-trap": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.3.tgz", - "integrity": "sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz", + "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==", "dependencies": { - "tabbable": "^6.1.2" + "tabbable": "^6.2.0" } }, "node_modules/follow-redirects": { @@ -20310,9 +20320,9 @@ } }, "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", "dev": true, "dependencies": { "@hapi/hoek": "^9.0.0", @@ -20322,6 +20332,26 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/jotai": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.5.1.tgz", + "integrity": "sha512-vanPCCSuHczUXNbVh/iUunuMfrWRL4FdBtAbTRmrfqezJcKb8ybBTg8iivyYuUHapjcDETyJe1E4inlo26bVHA==", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=17.0.0", + "react": ">=17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -28436,16 +28466,16 @@ } }, "node_modules/wait-on": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", - "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.1.0.tgz", + "integrity": "sha512-U7TF/OYYzAg+OoiT/B8opvN48UHt0QYMi4aD3PjRFpybQ+o6czQF8Ig3SKCCMJdxpBrCalIJ4O00FBof27Fu9Q==", "dev": true, "dependencies": { "axios": "^0.27.2", - "joi": "^17.7.0", + "joi": "^17.11.0", "lodash": "^4.17.21", - "minimist": "^1.2.7", - "rxjs": "^7.8.0" + "minimist": "^1.2.8", + "rxjs": "^7.8.1" }, "bin": { "wait-on": "bin/wait-on" @@ -32370,57 +32400,65 @@ } }, "@patternfly/react-component-groups": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@patternfly/react-component-groups/-/react-component-groups-1.0.17.tgz", - "integrity": "sha512-SeTnlmEyk9q/TxnLs2WCNuEhpD9iKdgArW+OnW6O/rm/VDtPAeJ7O+SYT0JeZDqtNzMvAb9D02GE06k+5urchQ==", + "version": "5.0.0-prerelease.6", + "resolved": "https://registry.npmjs.org/@patternfly/react-component-groups/-/react-component-groups-5.0.0-prerelease.6.tgz", + "integrity": "sha512-xqcq3BUuk5ISpBuYDhUBalAz7SV3T5KNhM7pI4RG66Av7S7l5qRGjWJr83beLSb5rN3lbQEDhFGBWkBBuZjShw==", "requires": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-icons": "^5.0.0", - "react-jss": "^10.9.2" + "@patternfly/react-core": "^5.1.1", + "@patternfly/react-icons": "^5.1.1", + "@patternfly/react-table": "^5.1.1", + "clsx": "^2.0.0", + "react-jss": "^10.10.0" + }, + "dependencies": { + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + } } }, "@patternfly/react-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.0.1.tgz", - "integrity": "sha512-Eevd+8ACLFV733J+cpo4FRgNtRBObIgmUcrqLjf9H99jZ1hFpBgacFyHiALFi2cuoNVGmdEzskFl+4c7Uo0n+w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.1.1.tgz", + "integrity": "sha512-9DbgQMXYmF8A4aCNLKXwIN1H07SIPoPaVLvx+yiDuJfDx4Qi0T+H7j5cx0VfDfxuCpqea3POJWqBQn1HnwS4wQ==", "requires": { - "@patternfly/react-icons": "^5.0.1", - "@patternfly/react-styles": "^5.0.1", - "@patternfly/react-tokens": "^5.0.1", - "focus-trap": "7.4.3", + "@patternfly/react-icons": "^5.1.1", + "@patternfly/react-styles": "^5.1.1", + "@patternfly/react-tokens": "^5.1.1", + "focus-trap": "7.5.2", "react-dropzone": "^14.2.3", "tslib": "^2.5.0" } }, "@patternfly/react-icons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.0.1.tgz", - "integrity": "sha512-MduetDRzve3eRlKAioM/UxmVuPyFccdeBWAKhbN4SBn7RaZWS7kO7/xZzNkpeT5pqQIeAACvz3uiV2/3uAf38w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.1.1.tgz", + "integrity": "sha512-9gCxkWz2xcdi0rtXu2F0L68w4tLIlsgGTACo1ggr4aVng9jRX++o1PlCOqscOd9o0NiFnFD7BLlZUGvJWaYEZg==", "requires": {} }, "@patternfly/react-styles": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.0.1.tgz", - "integrity": "sha512-kHP/lbvmhBnNfWiqJJLNwOQZnkcl6wfwAesRp22s4Lj941EWe0oFIqn925/uORIOAOz2du1121t7T4UTfLZg4w==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.1.1.tgz", + "integrity": "sha512-swO9X+WixYYDsMVsEJp1V8QUfhEQY91QfFm4phfYP4jc2TQ2opIFYdUIHkc+yrZwBhrgb/pPUUfemyqAoSbZcA==" }, "@patternfly/react-table": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.0.0.tgz", - "integrity": "sha512-Q3MBo9+ZmBvLJzVHxmV9f/4qQAz5Si743zVLHRwjh+tjbn/DrcbxJdT8Uxa3NGKkpvszzgi/LPeXipJOHOELug==", - "peer": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.1.1.tgz", + "integrity": "sha512-9tAtHj16hemJ6YRBWIm2O+QRNoFWYQt8ZLQ1G0KBwpg2t2G2CbGsS2RG+BamO4IVE6IPo3Yoo39p4UCNRiGVpA==", "requires": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-icons": "^5.0.0", - "@patternfly/react-styles": "^5.0.0", - "@patternfly/react-tokens": "^5.0.0", + "@patternfly/react-core": "^5.1.1", + "@patternfly/react-icons": "^5.1.1", + "@patternfly/react-styles": "^5.1.1", + "@patternfly/react-tokens": "^5.1.1", "lodash": "^4.17.19", "tslib": "^2.5.0" } }, "@patternfly/react-tokens": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.0.1.tgz", - "integrity": "sha512-YafAGJYvxDP4GaQ0vMybalWmx7MJ+etUf1cGoaMh0wRD2eswltT/RckygtEBKR/M61qXbgG+CxKmMyY8leoiDw==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.1.1.tgz", + "integrity": "sha512-cHuNkzNA9IY9aDwfjSEkitQoVEvRhOJRKhH0yIRlRByEkbdoV9jJZ9xj20hNShE+bxmNuom+MCTQSkpkN1bV8A==" }, "@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", @@ -32548,15 +32586,15 @@ } }, "@redhat-cloud-services/frontend-components": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.0.10.tgz", - "integrity": "sha512-xYgHwtpkPYXXByMizbraIm+M9WXS65FDwA4wIJq/hzOAiVv4WtORVCRn3Ysul3wAKlXLB9Q+M6kzxXXcbc+v4g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.1.0.tgz", + "integrity": "sha512-IsQf/DK5nA+ARFdq25o5Ndi2EAE5cgkDA80GjK3CluTvV+0ve5wRCtD/nCnVbRs9i/CbSAu8YTCvLA6tCTUKyA==", "requires": { - "@patternfly/react-component-groups": "^1.0.17", + "@patternfly/react-component-groups": "^5.0.0-prerelease.5", "@redhat-cloud-services/frontend-components-utilities": "^4.0.0", "@redhat-cloud-services/types": "^0.0.24", - "@scalprum/core": "^0.5.1", - "@scalprum/react-core": "^0.5.1", + "@scalprum/core": "^0.5.4", + "@scalprum/react-core": "^0.5.4", "sanitize-html": "^2.7.2" }, "dependencies": { @@ -32630,12 +32668,12 @@ } }, "@redhat-cloud-services/frontend-components-notifications": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-4.0.2.tgz", - "integrity": "sha512-xivlLFmlAhn+WNwaKuHXXQhSeVW+EkuApAErhvYanC5SZ32H9cIzp4aF61ZoLv7A1pjTSu/QcZ+BxvfTKCNrUQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-4.1.0.tgz", + "integrity": "sha512-bEoAeZMVY+UuSriSeruZ1pIesiPEjScrVFJQ5Wq/w3UFc79oXSYOgpRElxblPUH/LbKqp7inbzqRm2FxMcVxYg==", "requires": { - "@redhat-cloud-services/frontend-components": "^4.0.0", - "@redhat-cloud-services/frontend-components-utilities": "^4.0.0", + "@redhat-cloud-services/frontend-components": "^4.0.9", + "@redhat-cloud-services/frontend-components-utilities": "^4.0.2", "redux-promise-middleware": "6.1.3" } }, @@ -39552,11 +39590,11 @@ "dev": true }, "focus-trap": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.3.tgz", - "integrity": "sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz", + "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==", "requires": { - "tabbable": "^6.1.2" + "tabbable": "^6.2.0" } }, "follow-redirects": { @@ -43451,9 +43489,9 @@ } }, "joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", "dev": true, "requires": { "@hapi/hoek": "^9.0.0", @@ -43463,6 +43501,12 @@ "@sideway/pinpoint": "^2.0.0" } }, + "jotai": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.5.1.tgz", + "integrity": "sha512-vanPCCSuHczUXNbVh/iUunuMfrWRL4FdBtAbTRmrfqezJcKb8ybBTg8iivyYuUHapjcDETyJe1E4inlo26bVHA==", + "requires": {} + }, "js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -49853,16 +49897,16 @@ } }, "wait-on": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", - "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.1.0.tgz", + "integrity": "sha512-U7TF/OYYzAg+OoiT/B8opvN48UHt0QYMi4aD3PjRFpybQ+o6czQF8Ig3SKCCMJdxpBrCalIJ4O00FBof27Fu9Q==", "dev": true, "requires": { "axios": "^0.27.2", - "joi": "^17.7.0", + "joi": "^17.11.0", "lodash": "^4.17.21", - "minimist": "^1.2.7", - "rxjs": "^7.8.0" + "minimist": "^1.2.8", + "rxjs": "^7.8.1" } }, "walkdir": { diff --git a/package.json b/package.json index 726e75d82..3e7aec0fc 100644 --- a/package.json +++ b/package.json @@ -163,6 +163,7 @@ "classnames": "^2.3.2", "commander": "^10.0.0", "history": "^5.3.0", + "jotai": "^2.5.1", "js-cookie": "^3.0.1", "js-yaml": "^4.1.0", "localforage": "^1.10.0", diff --git a/src/components/Header/HeaderTests/ToolbarToggle.test.js b/src/components/Header/HeaderTests/ToolbarToggle.test.js index c2e47d903..72a184441 100644 --- a/src/components/Header/HeaderTests/ToolbarToggle.test.js +++ b/src/components/Header/HeaderTests/ToolbarToggle.test.js @@ -1,5 +1,5 @@ import React from 'react'; -import { act, fireEvent, render } from '@testing-library/react'; +import { act, fireEvent, render, screen } from '@testing-library/react'; import ToolbarToggle from '../ToolbarToggle'; describe('ToolbarToggle', () => { @@ -34,7 +34,7 @@ describe('ToolbarToggle', () => { const toggleButton = container.querySelector('#foo'); expect(toggleButton).toBeTruthy(); await act(async () => { - fireEvent.click(toggleButton); + await fireEvent.click(toggleButton); }); expect(container.querySelector('div')).toMatchSnapshot(); }); @@ -42,27 +42,45 @@ describe('ToolbarToggle', () => { it('should open/close menu correctly', async () => { const { container } = render(); const toggleButton = container.querySelector('#foo'); - expect(toggleButton).toBeTruthy(); + const expectedTexts = toolbarToggleProps.dropdownItems.filter((item) => !item.isHidden); + expect(toggleButton).toBeInTheDocument(); + await act(async () => { + await fireEvent.click(toggleButton); + }); + + // wait for async actions on toggle to complete await act(async () => { - fireEvent.click(toggleButton); + await Promise.resolve(); }); - expect(container.querySelectorAll('.pf-v5-c-menu__list-item')).toHaveLength(2); + + for (const item of expectedTexts) { + expect(screen.getByText(item.title)).toBeInTheDocument(); + } + // closes button + await act(async () => { + await fireEvent.click(toggleButton); + }); + + // wait for async actions on toggle to complete await act(async () => { - fireEvent.click(toggleButton); + await Promise.resolve(); }); - expect(container.querySelectorAll('.pf-v5-c-menu__list-item')).toHaveLength(0); + for (const item of expectedTexts) { + expect(screen.queryByText(item.title)).not.toBeInTheDocument(); + } + // expect(container.querySelectorAll('.pf-v5-c-menu__list-item')).toHaveLength(0); }); it('should call onClick menu item callback', async () => { const { container } = render(); const toggleButton = container.querySelector('#foo'); await act(async () => { - fireEvent.click(toggleButton); + await fireEvent.click(toggleButton); }); const actionButton = container.querySelector('button.pf-v5-c-menu__item'); expect(actionButton).toBeTruthy(); await act(async () => { - fireEvent.click(actionButton); + await fireEvent.click(actionButton); }); expect(clickSpy).toHaveBeenCalled(); }); diff --git a/src/components/Header/HeaderTests/__snapshots__/HeaderAlert.test.js.snap b/src/components/Header/HeaderTests/__snapshots__/HeaderAlert.test.js.snap index 2a837f516..9c3b4d27e 100644 --- a/src/components/Header/HeaderTests/__snapshots__/HeaderAlert.test.js.snap +++ b/src/components/Header/HeaderTests/__snapshots__/HeaderAlert.test.js.snap @@ -28,7 +28,7 @@ exports[`HeaderAlert should render correctly dismissable 1`] = ` class="pf-v5-c-alert__title" > Info alert: @@ -92,7 +92,7 @@ exports[`HeaderAlert should render correctly not dismissable 1`] = ` class="pf-v5-c-alert__title" > Info alert: diff --git a/src/components/Header/HeaderTests/__snapshots__/ToolbarToggle.test.js.snap b/src/components/Header/HeaderTests/__snapshots__/ToolbarToggle.test.js.snap index ec837b4cb..66a53eb71 100644 --- a/src/components/Header/HeaderTests/__snapshots__/ToolbarToggle.test.js.snap +++ b/src/components/Header/HeaderTests/__snapshots__/ToolbarToggle.test.js.snap @@ -9,7 +9,7 @@ exports[`ToolbarToggle should render correctly 1`] = ` data-popper-escaped="true" data-popper-placement="bottom-end" data-popper-reference-hidden="true" - style="position: absolute; left: 0px; top: 0px; z-index: 9999; min-width: 0px; transform: translate(0px, 0px);" + style="position: absolute; left: 0px; top: 0px; z-index: 9999; opacity: 1; transition: opacity 0ms cubic-bezier(.54, 1.5, .38, 1.11); min-width: 0px; transform: translate(0px, 0px);" > @@ -79,7 +79,7 @@ exports[`ChromeNavItem should render navigation loader if schema was not loaded class="pf-v5-c-skeleton ins-c-skeleton ins-c-skeleton__lg ins-m-dark" > @@ -98,7 +98,7 @@ exports[`ChromeNavItem should render navigation loader if schema was not loaded class="pf-v5-c-skeleton ins-c-skeleton ins-c-skeleton__lg ins-m-dark" > @@ -117,7 +117,7 @@ exports[`ChromeNavItem should render navigation loader if schema was not loaded class="pf-v5-c-skeleton ins-c-skeleton ins-c-skeleton__lg ins-m-dark" > From ed0c237a5a21a3d97bd1e9407ba134eed9246185 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Tue, 14 Nov 2023 11:55:13 +0100 Subject: [PATCH 20/23] Use jotai for activeModule state managment. --- src/bootstrap.tsx | 46 ++++++++++--------- src/components/ChromeRoute/ChromeRoute.tsx | 9 ++-- .../ErrorComponents/DefaultErrorComponent.tsx | 6 +-- .../ErrorComponents/GatewayErrorComponent.tsx | 6 ++- src/components/Navigation/ChromeNavItem.tsx | 6 +-- src/components/RootApp/RootApp.tsx | 4 +- src/hooks/useDisablePendoOnLanding.ts | 6 +-- src/hooks/useTrackPendoUsage.ts | 6 +-- src/hooks/useUserSSOScopes.ts | 5 +- src/redux/action-types.ts | 1 - src/redux/actions.ts | 5 -- src/redux/chromeReducers.ts | 8 ---- src/redux/index.ts | 3 -- src/redux/store.d.ts | 1 - src/state/atoms.ts | 4 ++ src/state/chromeStore.ts | 15 ++++++ src/utils/createCase.ts | 8 ++-- 17 files changed, 76 insertions(+), 63 deletions(-) create mode 100644 src/state/atoms.ts create mode 100644 src/state/chromeStore.ts diff --git a/src/bootstrap.tsx b/src/bootstrap.tsx index 0849854ed..c2a7c50ac 100644 --- a/src/bootstrap.tsx +++ b/src/bootstrap.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react'; import { createRoot } from 'react-dom/client'; import { Provider, useSelector } from 'react-redux'; import { IntlProvider, ReactIntlErrorCode } from 'react-intl'; +import { Provider as JotaiProvider } from 'jotai'; import { spinUpStore } from './redux/redux-config'; import RootApp from './components/RootApp'; @@ -11,6 +12,7 @@ import { ReduxState } from './redux/store'; import OIDCProvider from './auth/OIDCConnector/OIDCProvider'; import messages from './locales/data.json'; import ErrorBoundary from './components/ErrorComponents/ErrorBoundary'; +import chromeStore from './state/chromeStore'; const isITLessEnv = ITLess(); const language: keyof typeof messages = 'en'; @@ -46,26 +48,28 @@ const entry = document.getElementById('chrome-entry'); if (entry) { const reactRoot = createRoot(entry); reactRoot.render( - - - { - if ( - (getEnv() === 'stage' && !window.location.origin.includes('foo')) || - localStorage.getItem('chrome:intl:debug') === 'true' || - !(error.code === ReactIntlErrorCode.MISSING_TRANSLATION) - ) { - console.error(error); - } - }} - > - - - - - - + + + + { + if ( + (getEnv() === 'stage' && !window.location.origin.includes('foo')) || + localStorage.getItem('chrome:intl:debug') === 'true' || + !(error.code === ReactIntlErrorCode.MISSING_TRANSLATION) + ) { + console.error(error); + } + }} + > + + + + + + + ); } diff --git a/src/components/ChromeRoute/ChromeRoute.tsx b/src/components/ChromeRoute/ChromeRoute.tsx index ba9fed78a..7e5a271cc 100644 --- a/src/components/ChromeRoute/ChromeRoute.tsx +++ b/src/components/ChromeRoute/ChromeRoute.tsx @@ -2,7 +2,7 @@ import { ScalprumComponent } from '@scalprum/react-core'; import React, { memo, useContext, useEffect } from 'react'; import LoadingFallback from '../../utils/loading-fallback'; import { batch, useDispatch, useSelector } from 'react-redux'; -import { changeActiveModule, toggleGlobalFilter, updateDocumentTitle } from '../../redux/actions'; +import { toggleGlobalFilter, updateDocumentTitle } from '../../redux/actions'; import ErrorComponent from '../ErrorComponents/DefaultErrorComponent'; import { getPendoConf } from '../../analytics'; import classNames from 'classnames'; @@ -12,6 +12,8 @@ import { ReduxState } from '../../redux/store'; import { DeepRequired } from 'utility-types'; import { ChromeUser } from '@redhat-cloud-services/types'; import ChromeAuthContext from '../../auth/ChromeAuthContext'; +import { useAtom } from 'jotai'; +import { activeModuleAtom } from '../../state/atoms'; export type ChromeRouteProps = { scope: string; @@ -29,9 +31,10 @@ const ChromeRoute = memo( const { setActiveHelpTopicByName } = useContext(HelpTopicContext); const { user } = useContext(ChromeAuthContext); const gatewayError = useSelector(({ chrome: { gatewayError } }: ReduxState) => gatewayError); - const activeModule = useSelector(({ chrome: { activeModule } }: ReduxState) => activeModule); const defaultTitle = useSelector(({ chrome: { modules } }: ReduxState) => modules?.[scope]?.defaultDocumentTitle || scope); + const [activeModule, setActiveModule] = useAtom(activeModuleAtom); + useEffect(() => { batch(() => { // Only trigger update on a first application render before any active module has been selected @@ -42,7 +45,7 @@ const ChromeRoute = memo( */ dispatch(updateDocumentTitle(defaultTitle || 'Hybrid Cloud Console')); } - dispatch(changeActiveModule(scope)); + setActiveModule(scope); }); /** * update pendo metadata on application change diff --git a/src/components/ErrorComponents/DefaultErrorComponent.tsx b/src/components/ErrorComponents/DefaultErrorComponent.tsx index f7b0de3c7..b574f9f33 100644 --- a/src/components/ErrorComponents/DefaultErrorComponent.tsx +++ b/src/components/ErrorComponents/DefaultErrorComponent.tsx @@ -12,12 +12,12 @@ import ExclamationCircleIcon from '@patternfly/react-icons/dist/dynamic/icons/ex import { chunkLoadErrorRefreshKey } from '../../utils/common'; import { useIntl } from 'react-intl'; import messages from '../../locales/Messages'; -import { useSelector } from 'react-redux'; -import { ReduxState } from '../../redux/store'; import './ErrorComponent.scss'; import { get3scaleError } from '../../utils/responseInterceptors'; import GatewayErrorComponent from './GatewayErrorComponent'; import { getUrl } from '../../hooks/useBundle'; +import { useAtomValue } from 'jotai'; +import { activeModuleAtom } from '../../state/atoms'; export type DefaultErrorComponentProps = { error?: any | Error; @@ -30,7 +30,7 @@ const DefaultErrorComponent = (props: DefaultErrorComponentProps) => { const intl = useIntl(); const [sentryId, setSentryId] = useState(); - const activeModule = useSelector(({ chrome: { activeModule } }: ReduxState) => activeModule); + const activeModule = useAtomValue(activeModuleAtom); const exceptionMessage = (props.error as Error)?.message ? (props.error as Error).message : 'Unhandled UI runtime error'; useEffect(() => { const sentryId = diff --git a/src/components/ErrorComponents/GatewayErrorComponent.tsx b/src/components/ErrorComponents/GatewayErrorComponent.tsx index 3a0e1c971..6b47bd87b 100644 --- a/src/components/ErrorComponents/GatewayErrorComponent.tsx +++ b/src/components/ErrorComponents/GatewayErrorComponent.tsx @@ -9,6 +9,8 @@ import { Text, TextContent } from '@patternfly/react-core/dist/dynamic/component import { useIntl } from 'react-intl'; import Messages from '../../locales/Messages'; import { ThreeScaleError } from '../../utils/responseInterceptors'; +import { useAtomValue } from 'jotai'; +import { activeModuleAtom } from '../../state/atoms'; export type GatewayErrorComponentProps = { error: ThreeScaleError; @@ -48,8 +50,10 @@ const Description = ({ detail, complianceError }: DescriptionProps) => { }; const GatewayErrorComponent = ({ error }: GatewayErrorComponentProps) => { + const activeModule = useAtomValue(activeModuleAtom); + const activeProduct = useSelector((state: ReduxState) => state.chrome.activeProduct); // get active product, fallback to module name if product is not defined - const serviceName = useSelector((state: ReduxState) => state.chrome.activeProduct || state.chrome.activeModule); + const serviceName = activeProduct || activeModule; return } serviceName={serviceName} />; }; diff --git a/src/components/Navigation/ChromeNavItem.tsx b/src/components/Navigation/ChromeNavItem.tsx index c0f4181b3..7ee8d9f6f 100644 --- a/src/components/Navigation/ChromeNavItem.tsx +++ b/src/components/Navigation/ChromeNavItem.tsx @@ -54,11 +54,7 @@ const ChromeNavItem = ({ isActive={active} to={href} ouiaId={title} - component={ - ((props: LinkWrapperProps) => ( - - )) as unknown as React.ReactNode - } + component={(props: LinkWrapperProps) => } > {typeof title === 'string' && !ignoreCase ? titleCase(title) : title}{' '} {isExternal && ( diff --git a/src/components/RootApp/RootApp.tsx b/src/components/RootApp/RootApp.tsx index d1e8d9fcf..07a341960 100644 --- a/src/components/RootApp/RootApp.tsx +++ b/src/components/RootApp/RootApp.tsx @@ -1,6 +1,7 @@ import React, { Suspense, lazy, memo, useContext, useEffect } from 'react'; import { unstable_HistoryRouter as HistoryRouter, HistoryRouterProps } from 'react-router-dom'; import { HelpTopicContainer, QuickStart, QuickStartContainer, QuickStartContainerProps } from '@patternfly/quickstarts'; +import { useAtomValue } from 'jotai'; import chromeHistory from '../../utils/chromeHistory'; import { FeatureFlagsProvider } from '../FeatureFlags'; import ScalprumRoot from './ScalprumRoot'; @@ -18,6 +19,7 @@ import { DeepRequired } from 'utility-types'; import ReactDOM from 'react-dom'; import { FooterProps } from '../Footer/Footer'; import ChromeAuthContext, { ChromeAuthContextValue } from '../../auth/ChromeAuthContext'; +import { activeModuleAtom } from '../../state/atoms'; const NotEntitledModal = lazy(() => import('../NotEntitledModal')); const Debugger = lazy(() => import('../Debugger')); @@ -29,7 +31,7 @@ const RootApp = memo((props: RootAppProps) => { const { activateQuickstart, allQuickStartStates, setAllQuickStartStates, activeQuickStartID, setActiveQuickStartID } = useQuickstartsStates(); const { helpTopics, addHelpTopics, disableTopics, enableTopics } = useHelpTopicState(); const dispatch = useDispatch(); - const activeModule = useSelector(({ chrome: { activeModule } }: ReduxState) => activeModule); + const activeModule = useAtomValue(activeModuleAtom); const quickStarts = useSelector( ({ chrome: { diff --git a/src/hooks/useDisablePendoOnLanding.ts b/src/hooks/useDisablePendoOnLanding.ts index 0ee17c218..ae7cd3b06 100644 --- a/src/hooks/useDisablePendoOnLanding.ts +++ b/src/hooks/useDisablePendoOnLanding.ts @@ -1,7 +1,7 @@ import { useEffect } from 'react'; -import { useSelector } from 'react-redux'; -import { ReduxState } from '../redux/store'; import { isITLessEnv } from '../utils/consts'; +import { useAtomValue } from 'jotai'; +import { activeModuleAtom } from '../state/atoms'; // interval timing is short because we want to catch the bubble before ASAP so it does not cover the VA button const RETRY_ATTEMPS = 2000; @@ -23,7 +23,7 @@ function retry(fn: () => void, retriesLeft = 50, interval = 100) { } const useDisablePendoOnLanding = () => { - const activeModule = useSelector((state: ReduxState) => state.chrome.activeModule); + const activeModule = useAtomValue(activeModuleAtom); const toggleGuides = () => { // push the call to the end of the event loop to make sure the pendo script is loaded and initialized diff --git a/src/hooks/useTrackPendoUsage.ts b/src/hooks/useTrackPendoUsage.ts index 1c0c2bea2..4f55be074 100644 --- a/src/hooks/useTrackPendoUsage.ts +++ b/src/hooks/useTrackPendoUsage.ts @@ -1,7 +1,7 @@ -import { useSelector } from 'react-redux'; -import { ReduxState } from '../redux/store'; +import { useAtomValue } from 'jotai'; import { useCallback, useEffect, useRef } from 'react'; import { useSegment } from '../analytics/useSegment'; +import { activeModuleAtom } from '../state/atoms'; const badgeQuery = 'div[id^="_pendo-badge_"]'; const RETRY_ATTEMPS = 10; @@ -9,7 +9,7 @@ const RETRY_INTERVAL = 2000; const SEGMENT_EVENT_NAME = 'pendo-badge-clicked'; const useTrackPendoUsage = () => { - const activeModule = useSelector((state) => state.chrome.activeModule); + const activeModule = useAtomValue(activeModuleAtom); const mutableData = useRef({ activeModule }); const { analytics } = useSegment(); const setupEventTracking = useCallback(() => { diff --git a/src/hooks/useUserSSOScopes.ts b/src/hooks/useUserSSOScopes.ts index e857786d8..6c84f2912 100644 --- a/src/hooks/useUserSSOScopes.ts +++ b/src/hooks/useUserSSOScopes.ts @@ -3,6 +3,8 @@ import { useSelector } from 'react-redux'; import { ReduxState } from '../redux/store'; import { LOGIN_SCOPES_STORAGE_KEY } from '../utils/common'; import ChromeAuthContext from '../auth/ChromeAuthContext'; +import { useAtomValue } from 'jotai'; +import { activeModuleAtom } from '../state/atoms'; /** * If required, attempt to reauthenticate current user with full profile login. @@ -17,8 +19,9 @@ const useUserSSOScopes = () => { return []; } }; + const activeModuleId = useAtomValue(activeModuleAtom); // get scope module definition - const activeModule = useSelector(({ chrome: { activeModule, modules } }: ReduxState) => (activeModule ? (modules || {})[activeModule] : undefined)); + const activeModule = useSelector(({ chrome: { modules } }: ReduxState) => (activeModuleId ? (modules || {})[activeModuleId] : undefined)); const requiredScopes = activeModule?.config?.ssoScopes || []; useEffect(() => { diff --git a/src/redux/action-types.ts b/src/redux/action-types.ts index 16b3f49fb..08c20fb32 100644 --- a/src/redux/action-types.ts +++ b/src/redux/action-types.ts @@ -21,7 +21,6 @@ export const LOAD_NAVIGATION_LANDING_PAGE = '@@chrome/load-navigation-landing-pa export const LOAD_LEFT_NAVIGATION_SEGMENT = '@@chrome/load-navigation-segment'; export const LOAD_MODULES_SCHEMA = '@@chrome/load-modules-schema'; -export const CHANGE_ACTIVE_MODULE = '@@chrome/change-active-module'; export const SET_PENDO_FEEDBACK_FLAG = '@@chrome/set-pendo-feedback-flag'; export const TOGGLE_FEEDBACK_MODAL = '@@chrome/toggle-feedback-modal'; export const TOGGLE_DEBUGGER_MODAL = '@@chrome/toggle-debugger-modal'; diff --git a/src/redux/actions.ts b/src/redux/actions.ts index 351283917..f3b580d50 100644 --- a/src/redux/actions.ts +++ b/src/redux/actions.ts @@ -119,11 +119,6 @@ export const loadModulesSchema = (schema: { [key: string]: ChromeModule }) => ({ }, }); -export const changeActiveModule = (module: string) => ({ - type: actionTypes.CHANGE_ACTIVE_MODULE, - payload: module, -}); - /** * @deprecated */ diff --git a/src/redux/chromeReducers.ts b/src/redux/chromeReducers.ts index 8fb974ecc..1ef33d061 100644 --- a/src/redux/chromeReducers.ts +++ b/src/redux/chromeReducers.ts @@ -154,14 +154,6 @@ export function loadModulesSchemaReducer( }; } -export function changeActiveModuleReducer(state: ChromeState, { payload }: { payload: string }): ChromeState { - return { - ...state, - activeModule: payload, - appId: payload, - }; -} - export function setPendoFeedbackFlag( state: ChromeState, { diff --git a/src/redux/index.ts b/src/redux/index.ts index 402987f0e..e7aff72f6 100644 --- a/src/redux/index.ts +++ b/src/redux/index.ts @@ -4,7 +4,6 @@ import { accessRequestsNotificationsReducer, addQuickstartstoApp, appNavClick, - changeActiveModuleReducer, clearQuickstartsReducer, contextSwitcherBannerReducer, disableQuickstartsReducer, @@ -48,7 +47,6 @@ import { import { ADD_QUICKSTARTS_TO_APP, APP_NAV_CLICK, - CHANGE_ACTIVE_MODULE, CHROME_GET_ALL_SIDS, CHROME_GET_ALL_TAGS, CHROME_GET_ALL_WORKLOADS, @@ -97,7 +95,6 @@ const reducers = { [LOAD_NAVIGATION_LANDING_PAGE]: loadNavigationLandingPageReducer, [LOAD_LEFT_NAVIGATION_SEGMENT]: loadNavigationSegmentReducer, [LOAD_MODULES_SCHEMA]: loadModulesSchemaReducer, - [CHANGE_ACTIVE_MODULE]: changeActiveModuleReducer, [SET_PENDO_FEEDBACK_FLAG]: setPendoFeedbackFlag, [TOGGLE_FEEDBACK_MODAL]: toggleFeedbackModal, [TOGGLE_DEBUGGER_MODAL]: toggleDebuggerModal, diff --git a/src/redux/store.d.ts b/src/redux/store.d.ts index 734f03bd8..231468388 100644 --- a/src/redux/store.d.ts +++ b/src/redux/store.d.ts @@ -39,7 +39,6 @@ export type NotificationsPayload = { export type ChromeState = { contextSwitcherOpen: boolean; activeApp?: string; - activeModule?: string; activeProduct?: string; /** * @deprecated diff --git a/src/state/atoms.ts b/src/state/atoms.ts new file mode 100644 index 000000000..873317f5b --- /dev/null +++ b/src/state/atoms.ts @@ -0,0 +1,4 @@ +import { atom } from 'jotai'; +// setup initial chrome atoms +export const contextSwitcherOpenAtom = atom(false); +export const activeModuleAtom = atom(undefined); diff --git a/src/state/chromeStore.ts b/src/state/chromeStore.ts new file mode 100644 index 000000000..d0e94f57a --- /dev/null +++ b/src/state/chromeStore.ts @@ -0,0 +1,15 @@ +import { createStore } from 'jotai'; +import { activeModuleAtom, contextSwitcherOpenAtom } from './atoms'; + +const chromeStore = createStore(); + +// setup initial chrome store state +chromeStore.set(contextSwitcherOpenAtom, false); +chromeStore.set(activeModuleAtom, undefined); + +// globally handle subscription to activeModuleAtom +chromeStore.sub(activeModuleAtom, () => { + // console.log('activeModule in store', chromeStore.get(activeModuleAtom)); +}); + +export default chromeStore; diff --git a/src/utils/createCase.ts b/src/utils/createCase.ts index a1e711671..d84293cd0 100644 --- a/src/utils/createCase.ts +++ b/src/utils/createCase.ts @@ -5,9 +5,10 @@ const log = logger('createCase.js'); import { getEnvDetails, isBeta, isProd } from './common'; import { HYDRA_ENDPOINT } from './consts'; -import { spinUpStore } from '../redux/redux-config'; import { ChromeUser } from '@redhat-cloud-services/types'; import { getUrl } from '../hooks/useBundle'; +import chromeStore from '../state/chromeStore'; +import { activeModuleAtom } from '../state/atoms'; // Lit of products that are bundles const BUNDLE_PRODUCTS = [ @@ -62,9 +63,8 @@ async function getAppInfo(activeModule: string) { } async function getProductData() { - const { store } = spinUpStore(); - const activeModule = store.getState().chrome.activeModule || ''; - const appData = await getAppInfo(activeModule); + const activeModule = chromeStore.get(activeModuleAtom); + const appData = await getAppInfo(activeModule ?? ''); return appData; } From 403f42ae434476e772402e034a6796988585e488 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Wed, 6 Dec 2023 13:28:11 +0100 Subject: [PATCH 21/23] Use active module for global filder disabled flag. --- src/components/GlobalFilter/GlobalFilter.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/GlobalFilter/GlobalFilter.tsx b/src/components/GlobalFilter/GlobalFilter.tsx index 912106cb3..b9abf199a 100644 --- a/src/components/GlobalFilter/GlobalFilter.tsx +++ b/src/components/GlobalFilter/GlobalFilter.tsx @@ -12,6 +12,8 @@ import { FlagTagsFilter } from '../../@types/types'; import { isGlobalFilterAllowed } from '../../utils/common'; import InternalChromeContext from '../../utils/internalChromeContext'; import ChromeAuthContext from '../../auth/ChromeAuthContext'; +import { useAtomValue } from 'jotai'; +import { activeModuleAtom } from '../../state/atoms'; const useLoadTags = (hasAccess = false) => { const navigate = useNavigate(); @@ -63,7 +65,9 @@ const GlobalFilter = ({ hasAccess }: { hasAccess: boolean }) => { }), shallowEqual ); - const isDisabled = useSelector(({ globalFilter: { globalFilterHidden }, chrome: { appId } }: ReduxState) => globalFilterHidden || !appId); + const globalFilterHidden = useSelector(({ globalFilter: { globalFilterHidden } }: ReduxState) => globalFilterHidden); + const activeModule = useAtomValue(activeModuleAtom); + const isDisabled = globalFilterHidden || !activeModule; const { filter, chips, selectedTags, setValue, filterTagsBy } = ( useTagsFilter as unknown as ( From cc9133a25501389532e00215246c9df088194d90 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Thu, 7 Dec 2023 15:02:02 +0100 Subject: [PATCH 22/23] Remove appId from chrome state. --- src/components/ChromeLink/ChromeLink.tsx | 4 +++- src/components/GlobalFilter/GlobalFilter.tsx | 3 ++- src/redux/store.d.ts | 5 ----- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/ChromeLink/ChromeLink.tsx b/src/components/ChromeLink/ChromeLink.tsx index 0c8aa3127..a6272d73c 100644 --- a/src/components/ChromeLink/ChromeLink.tsx +++ b/src/components/ChromeLink/ChromeLink.tsx @@ -7,6 +7,8 @@ import { appNavClick } from '../../redux/actions'; import NavContext, { OnLinkClick } from '../Navigation/navContext'; import { ReduxState } from '../../redux/store'; import { NavDOMEvent, RouteDefinition } from '../../@types/types'; +import { useAtomValue } from 'jotai'; +import { activeModuleAtom } from '../../state/atoms'; interface RefreshLinkProps extends React.HTMLAttributes { isExternal?: boolean; @@ -137,7 +139,7 @@ const RefreshLink: React.FC = (props) => { const ChromeLink: React.FC = ({ appId, children, ...rest }) => { const { onLinkClick, isNavOpen, inPageLayout } = useContext(NavContext); - const currAppId = useSelector(({ chrome }: ReduxState) => chrome?.appId); + const currAppId = useAtomValue(activeModuleAtom); const LinkComponent = !rest.isExternal ? LinkWrapper : RefreshLink; return ( diff --git a/src/components/GlobalFilter/GlobalFilter.tsx b/src/components/GlobalFilter/GlobalFilter.tsx index b9abf199a..b03f4f2d9 100644 --- a/src/components/GlobalFilter/GlobalFilter.tsx +++ b/src/components/GlobalFilter/GlobalFilter.tsx @@ -18,7 +18,8 @@ import { activeModuleAtom } from '../../state/atoms'; const useLoadTags = (hasAccess = false) => { const navigate = useNavigate(); const registeredWith = useSelector(({ globalFilter: { scope } }: ReduxState) => scope); - const isDisabled = useSelector(({ globalFilter: { globalFilterHidden }, chrome: { appId } }: ReduxState) => globalFilterHidden || !appId); + const activeModule = useAtomValue(activeModuleAtom); + const isDisabled = useSelector(({ globalFilter: { globalFilterHidden } }: ReduxState) => globalFilterHidden || !activeModule); const dispatch = useDispatch(); return useCallback( debounce((activeTags: any, search: any) => { diff --git a/src/redux/store.d.ts b/src/redux/store.d.ts index 231468388..3ae8c581b 100644 --- a/src/redux/store.d.ts +++ b/src/redux/store.d.ts @@ -40,11 +40,6 @@ export type ChromeState = { contextSwitcherOpen: boolean; activeApp?: string; activeProduct?: string; - /** - * @deprecated - * App id is replaced by active module. It is still required until we completely remove usage of main.yml - */ - appId?: string; missingIDP?: boolean; pageAction?: string; pageObjectId?: string; From 6b2118ba743491fcd30b9adc09f2390399e481a5 Mon Sep 17 00:00:00 2001 From: Martin Marosi Date: Fri, 8 Dec 2023 13:24:21 +0100 Subject: [PATCH 23/23] Enable auth header inclusion for openshift API origin. --- src/utils/iqeEnablement.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/utils/iqeEnablement.ts b/src/utils/iqeEnablement.ts index 79176ecb4..74392d51c 100644 --- a/src/utils/iqeEnablement.ts +++ b/src/utils/iqeEnablement.ts @@ -9,15 +9,16 @@ import crossAccountBouncer from '../auth/crossAccountBouncer'; let xhrResults: XMLHttpRequest[] = []; let fetchResults: Record = {}; -const DENINED_CROSS_CHECK = 'Access denied from RBAC on cross-access check'; +const DENIED_CROSS_CHECK = 'Access denied from RBAC on cross-access check'; +const AUTH_ALLOWED_ORIGINS = [location.origin, 'https://api.openshift.com', 'https://api.stage.openshift.com']; const checkOrigin = (path: URL | Request | string = '') => { - if (path.constructor.name === 'URL') { - return (path as URL).origin === location.origin; - } else if (path.constructor.name === 'Request') { - return (path as Request).url.includes(location.origin); - } else if (path.constructor.name === 'String') { - return (path as string).includes(location.origin) || !(path as string).startsWith('http'); + if (path instanceof URL) { + return AUTH_ALLOWED_ORIGINS.includes(path.origin); + } else if (path instanceof Request) { + return AUTH_ALLOWED_ORIGINS.some((origin) => path.url.includes(origin)); + } else if (typeof path === 'string') { + return AUTH_ALLOWED_ORIGINS.some((origin) => path.includes(origin)) || !path.startsWith('http'); } return true; @@ -87,7 +88,7 @@ export function init(store: Store, token: string) { this.onload = function () { if (this.status >= 400) { const gatewayError = get3scaleError(this.response); - if (this.status === 403 && this.responseText.includes(DENINED_CROSS_CHECK)) { + if (this.status === 403 && this.responseText.includes(DENIED_CROSS_CHECK)) { crossAccountBouncer(); // check for 3scale error } else if (gatewayError) {