From 8099347842c928796cc8561457b79711e0b490c5 Mon Sep 17 00:00:00 2001 From: EloWord Date: Tue, 6 Feb 2024 21:48:33 +0100 Subject: [PATCH] Initial commit --- LICENSE | 707 ++ README.md | 27 + angular.json | 118 + app.js | 126 + dev-proxy.js | 41 + forge.config.js | 29 + ngsw-config.json | 30 + package.json | 80 + reqs/qli.ico | Bin 0 -> 12572 bytes reqs/qli.png | Bin 0 -> 12599 bytes src/app/app-routing.module.ts | 96 + src/app/app.component.html | 1 + src/app/app.component.scss | 36 + src/app/app.component.ts | 57 + src/app/app.module.ts | 186 + src/app/assets/assets.component.html | 206 + src/app/assets/assets.component.scss | 65 + src/app/assets/assets.component.spec.ts | 23 + src/app/assets/assets.component.ts | 268 + src/app/balance/balance.component.html | 80 + src/app/balance/balance.component.scss | 75 + src/app/balance/balance.component.ts | 94 + .../file-selector.component.html | 23 + .../file-selector.component.scss | 8 + .../file-selector/file-selector.component.ts | 30 + .../confirm-dialog.component.html | 10 + .../confirm-dialog.component.scss | 18 + .../confirm-dialog.component.ts | 30 + src/app/core/dialog-wrapper/dialog-wrapper.ts | 11 + .../language-chooser.component.html | 13 + .../language-chooser.component.scss | 7 + .../language-chooser.component.ts | 48 + .../core/ok-dialog/ok-dialog.component.html | 9 + .../core/ok-dialog/ok-dialog.component.scss | 24 + src/app/core/ok-dialog/ok-dialog.component.ts | 51 + .../transfer-status.component.html | 50 + .../transfer-status.component.scss | 3 + .../transfer-status.component.ts | 21 + src/app/guards/wallet-ready.guard.ts | 9 + src/app/ipo/ipo.component.html | 99 + src/app/ipo/ipo.component.scss | 59 + src/app/ipo/ipo.component.ts | 130 + .../ipo/place-bid/place-bid.component.html | 108 + .../ipo/place-bid/place-bid.component.scss | 124 + src/app/ipo/place-bid/place-bid.component.ts | 193 + .../config-error/config-error.component.html | 13 + .../config-error/config-error.component.scss | 4 + .../config-error/config-error.component.ts | 33 + .../confirm-lock/confirm-lock.component.html | 42 + .../confirm-lock/confirm-lock.component.scss | 15 + .../confirm-lock/confirm-lock.component.ts | 97 + .../export-config.component.html | 68 + .../export-config.component.scss | 41 + .../export-config/export-config.component.ts | 51 + .../load-config/load-config.component.html | 35 + .../load-config/load-config.component.scss | 17 + .../lock/load-config/load-config.component.ts | 100 + src/app/lock/lock.component.html | 10 + src/app/lock/lock.component.scss | 0 src/app/lock/lock.component.ts | 43 + src/app/lock/unlock/unlock.component.html | 102 + src/app/lock/unlock/unlock.component.scss | 11 + src/app/lock/unlock/unlock.component.ts | 279 + src/app/main/assets/assets.component.html | 16 + src/app/main/assets/assets.component.scss | 11 + src/app/main/assets/assets.component.ts | 28 + .../main/edit-seed/seed-edit.component.html | 86 + .../main/edit-seed/seed-edit.component.scss | 47 + src/app/main/edit-seed/seed-edit.component.ts | 143 + src/app/main/main.component.html | 223 + src/app/main/main.component.scss | 76 + src/app/main/main.component.ts | 316 + .../main/qr-receive/qr-receive.component.html | 15 + .../main/qr-receive/qr-receive.component.scss | 8 + .../main/qr-receive/qr-receive.component.ts | 34 + .../reveal-seed/reveal-seed.component.html | 28 + .../reveal-seed/reveal-seed.component.scss | 11 + .../main/reveal-seed/reveal-seed.component.ts | 30 + src/app/model/config.ts | 26 + src/app/model/seed.ts | 16 + src/app/model/tx.ts | 6 + src/app/navigation/navigation.component.html | 146 + src/app/navigation/navigation.component.scss | 107 + .../navigation/navigation.component.spec.ts | 40 + src/app/navigation/navigation.component.ts | 160 + src/app/notifys/notifys.component.html | 19 + src/app/notifys/notifys.component.scss | 6 + src/app/notifys/notifys.component.ts | 74 + src/app/payment/payment.component.html | 136 + src/app/payment/payment.component.scss | 38 + src/app/payment/payment.component.ts | 208 + .../create-vault/create-vault.component.html | 144 + .../create-vault/create-vault.component.scss | 7 + .../create-vault/create-vault.component.ts | 259 + src/app/public/import/import.component.html | 76 + src/app/public/import/import.component.scss | 8 + src/app/public/import/import.component.ts | 198 + src/app/public/unlock/unlock.component.html | 74 + src/app/public/unlock/unlock.component.scss | 11 + src/app/public/unlock/unlock.component.ts | 183 + src/app/public/welcome/welcome.component.html | 30 + src/app/public/welcome/welcome.component.scss | 12 + src/app/public/welcome/welcome.component.ts | 71 + src/app/services/api.model.ts | 154 + src/app/services/api.service.ts | 254 + src/app/services/auth-interceptor.ts | 28 + src/app/services/env.service.ts | 32 + src/app/services/qubic.service.ts | 190 + src/app/services/theme.service.ts | 20 + src/app/services/token.service.ts | 27 + src/app/services/transaction.service.ts | 160 + src/app/services/updater-service.ts | 280 + src/app/services/visibility.service.ts | 31 + src/app/services/wallet.service.ts | 823 ++ .../settings/account/account.component.html | 5 + .../settings/account/account.component.scss | 0 src/app/settings/account/account.component.ts | 10 + src/app/settings/export/export.component.html | 42 + src/app/settings/export/export.component.scss | 21 + src/app/settings/export/export.component.ts | 98 + .../settings/general/general.component.html | 29 + .../settings/general/general.component.scss | 10 + src/app/settings/general/general.component.ts | 52 + src/app/settings/settings.component.html | 8 + src/app/settings/settings.component.scss | 0 src/app/settings/settings.component.spec.ts | 23 + src/app/settings/settings.component.ts | 10 + src/app/transloco-root.module.ts | 49 + .../create/voting-create.component.html | 287 + .../create/voting-create.component.scss | 103 + .../voting/create/voting-create.component.ts | 340 + .../voting-participate.component.html | 117 + .../voting-participate.component.scss | 123 + .../voting-participate.component.ts | 458 + .../voting-status.component.html | 51 + .../voting-status.component.scss | 3 + .../voting-status/voting-status.component.ts | 29 + src/app/voting/voting.component.html | 69 + src/app/voting/voting.component.scss | 6 + src/app/voting/voting.component.ts | 101 + src/assets/.gitkeep | 0 src/assets/fonts/PPTelegraf-Bold.ttf | Bin 0 -> 68864 bytes src/assets/fonts/PPTelegraf-Light.ttf | Bin 0 -> 66584 bytes src/assets/fonts/PPTelegraf-Medium.ttf | Bin 0 -> 65780 bytes src/assets/fonts/PPTelegraf-Regular.ttf | Bin 0 -> 66984 bytes src/assets/fonts/PPTelegraf-SemiBold.ttf | Bin 0 -> 68472 bytes src/assets/i18n/de.json | 548 + src/assets/i18n/en.json | 551 + src/assets/i18n/es.json | 547 + src/assets/i18n/fr.json | 548 + src/assets/i18n/nl.json | 546 + src/assets/i18n/pt.json | 546 + src/assets/i18n/ru.json | 548 + src/assets/icons/icon-128x128.png | Bin 0 -> 848 bytes src/assets/icons/icon-144x144.png | Bin 0 -> 1302 bytes src/assets/icons/icon-152x152.png | Bin 0 -> 1313 bytes src/assets/icons/icon-192x192.png | Bin 0 -> 1203 bytes src/assets/icons/icon-384x384.png | Bin 0 -> 2863 bytes src/assets/icons/icon-512x512.png | Bin 0 -> 2863 bytes src/assets/icons/icon-72x72.png | Bin 0 -> 830 bytes src/assets/icons/icon-96x96.png | Bin 0 -> 1086 bytes src/assets/icons/wallet.svg | 4 + src/assets/icons/wallet_whitemode.svg | 4 + .../img/favicon/android-chrome-192x192.png | Bin 0 -> 1032 bytes .../img/favicon/android-chrome-512x512.png | Bin 0 -> 3038 bytes src/assets/img/favicon/apple-touch-icon.png | Bin 0 -> 989 bytes src/assets/img/favicon/favicon-16x16.png | Bin 0 -> 619 bytes src/assets/img/favicon/favicon-32x32.png | Bin 0 -> 733 bytes src/assets/img/favicon/favicon.ico | Bin 0 -> 15086 bytes src/assets/img/favicon/mstile-150x150.png | Bin 0 -> 1022 bytes src/assets/logo.svg | 1 + src/assets/logos/LogoFull_dark.svg | 8 + src/assets/logos/LogoFull_white.svg | 8 + src/assets/logos/Logo_dark.webp | Bin 0 -> 366 bytes src/assets/logos/Logo_light.webp | Bin 0 -> 350 bytes src/assets/logos/qubic_wallet_dark.svg | 9 + src/assets/logos/qubic_wallet_light.svg | 9 + src/environments/environment.prod.ts | 7 + src/environments/environment.ts | 7 + src/index.html | 29 + src/main.ts | 7 + src/manifest.webmanifest | 59 + src/site.webmanifest | 1 + src/styles.scss | 1133 ++ src/vars.scss | 6 + transloco.config.js | 5 + tsconfig.app.json | 14 + tsconfig.json | 34 + tsconfig.spec.json | 14 + yarn.lock | 9954 +++++++++++++++++ 190 files changed, 26701 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 angular.json create mode 100644 app.js create mode 100644 dev-proxy.js create mode 100644 forge.config.js create mode 100644 ngsw-config.json create mode 100644 package.json create mode 100644 reqs/qli.ico create mode 100644 reqs/qli.png create mode 100644 src/app/app-routing.module.ts create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.scss create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/app/assets/assets.component.html create mode 100644 src/app/assets/assets.component.scss create mode 100644 src/app/assets/assets.component.spec.ts create mode 100644 src/app/assets/assets.component.ts create mode 100644 src/app/balance/balance.component.html create mode 100644 src/app/balance/balance.component.scss create mode 100644 src/app/balance/balance.component.ts create mode 100644 src/app/common/file-selector/file-selector.component.html create mode 100644 src/app/common/file-selector/file-selector.component.scss create mode 100644 src/app/common/file-selector/file-selector.component.ts create mode 100644 src/app/core/confirm-dialog/confirm-dialog.component.html create mode 100644 src/app/core/confirm-dialog/confirm-dialog.component.scss create mode 100644 src/app/core/confirm-dialog/confirm-dialog.component.ts create mode 100644 src/app/core/dialog-wrapper/dialog-wrapper.ts create mode 100644 src/app/core/language-chooser/language-chooser.component.html create mode 100644 src/app/core/language-chooser/language-chooser.component.scss create mode 100644 src/app/core/language-chooser/language-chooser.component.ts create mode 100644 src/app/core/ok-dialog/ok-dialog.component.html create mode 100644 src/app/core/ok-dialog/ok-dialog.component.scss create mode 100644 src/app/core/ok-dialog/ok-dialog.component.ts create mode 100644 src/app/core/transfer-status/transfer-status.component.html create mode 100644 src/app/core/transfer-status/transfer-status.component.scss create mode 100644 src/app/core/transfer-status/transfer-status.component.ts create mode 100644 src/app/guards/wallet-ready.guard.ts create mode 100644 src/app/ipo/ipo.component.html create mode 100644 src/app/ipo/ipo.component.scss create mode 100644 src/app/ipo/ipo.component.ts create mode 100644 src/app/ipo/place-bid/place-bid.component.html create mode 100644 src/app/ipo/place-bid/place-bid.component.scss create mode 100644 src/app/ipo/place-bid/place-bid.component.ts create mode 100644 src/app/lock/config-error/config-error.component.html create mode 100644 src/app/lock/config-error/config-error.component.scss create mode 100644 src/app/lock/config-error/config-error.component.ts create mode 100644 src/app/lock/confirm-lock/confirm-lock.component.html create mode 100644 src/app/lock/confirm-lock/confirm-lock.component.scss create mode 100644 src/app/lock/confirm-lock/confirm-lock.component.ts create mode 100644 src/app/lock/export-config/export-config.component.html create mode 100644 src/app/lock/export-config/export-config.component.scss create mode 100644 src/app/lock/export-config/export-config.component.ts create mode 100644 src/app/lock/load-config/load-config.component.html create mode 100644 src/app/lock/load-config/load-config.component.scss create mode 100644 src/app/lock/load-config/load-config.component.ts create mode 100644 src/app/lock/lock.component.html create mode 100644 src/app/lock/lock.component.scss create mode 100644 src/app/lock/lock.component.ts create mode 100644 src/app/lock/unlock/unlock.component.html create mode 100644 src/app/lock/unlock/unlock.component.scss create mode 100644 src/app/lock/unlock/unlock.component.ts create mode 100644 src/app/main/assets/assets.component.html create mode 100644 src/app/main/assets/assets.component.scss create mode 100644 src/app/main/assets/assets.component.ts create mode 100644 src/app/main/edit-seed/seed-edit.component.html create mode 100644 src/app/main/edit-seed/seed-edit.component.scss create mode 100644 src/app/main/edit-seed/seed-edit.component.ts create mode 100644 src/app/main/main.component.html create mode 100644 src/app/main/main.component.scss create mode 100644 src/app/main/main.component.ts create mode 100644 src/app/main/qr-receive/qr-receive.component.html create mode 100644 src/app/main/qr-receive/qr-receive.component.scss create mode 100644 src/app/main/qr-receive/qr-receive.component.ts create mode 100644 src/app/main/reveal-seed/reveal-seed.component.html create mode 100644 src/app/main/reveal-seed/reveal-seed.component.scss create mode 100644 src/app/main/reveal-seed/reveal-seed.component.ts create mode 100644 src/app/model/config.ts create mode 100644 src/app/model/seed.ts create mode 100644 src/app/model/tx.ts create mode 100644 src/app/navigation/navigation.component.html create mode 100644 src/app/navigation/navigation.component.scss create mode 100644 src/app/navigation/navigation.component.spec.ts create mode 100644 src/app/navigation/navigation.component.ts create mode 100644 src/app/notifys/notifys.component.html create mode 100644 src/app/notifys/notifys.component.scss create mode 100644 src/app/notifys/notifys.component.ts create mode 100644 src/app/payment/payment.component.html create mode 100644 src/app/payment/payment.component.scss create mode 100644 src/app/payment/payment.component.ts create mode 100644 src/app/public/create-vault/create-vault.component.html create mode 100644 src/app/public/create-vault/create-vault.component.scss create mode 100644 src/app/public/create-vault/create-vault.component.ts create mode 100644 src/app/public/import/import.component.html create mode 100644 src/app/public/import/import.component.scss create mode 100644 src/app/public/import/import.component.ts create mode 100644 src/app/public/unlock/unlock.component.html create mode 100644 src/app/public/unlock/unlock.component.scss create mode 100644 src/app/public/unlock/unlock.component.ts create mode 100644 src/app/public/welcome/welcome.component.html create mode 100644 src/app/public/welcome/welcome.component.scss create mode 100644 src/app/public/welcome/welcome.component.ts create mode 100644 src/app/services/api.model.ts create mode 100644 src/app/services/api.service.ts create mode 100644 src/app/services/auth-interceptor.ts create mode 100644 src/app/services/env.service.ts create mode 100644 src/app/services/qubic.service.ts create mode 100644 src/app/services/theme.service.ts create mode 100644 src/app/services/token.service.ts create mode 100644 src/app/services/transaction.service.ts create mode 100644 src/app/services/updater-service.ts create mode 100644 src/app/services/visibility.service.ts create mode 100644 src/app/services/wallet.service.ts create mode 100644 src/app/settings/account/account.component.html create mode 100644 src/app/settings/account/account.component.scss create mode 100644 src/app/settings/account/account.component.ts create mode 100644 src/app/settings/export/export.component.html create mode 100644 src/app/settings/export/export.component.scss create mode 100644 src/app/settings/export/export.component.ts create mode 100644 src/app/settings/general/general.component.html create mode 100644 src/app/settings/general/general.component.scss create mode 100644 src/app/settings/general/general.component.ts create mode 100644 src/app/settings/settings.component.html create mode 100644 src/app/settings/settings.component.scss create mode 100644 src/app/settings/settings.component.spec.ts create mode 100644 src/app/settings/settings.component.ts create mode 100644 src/app/transloco-root.module.ts create mode 100644 src/app/voting/create/voting-create.component.html create mode 100644 src/app/voting/create/voting-create.component.scss create mode 100644 src/app/voting/create/voting-create.component.ts create mode 100644 src/app/voting/participate/voting-participate.component.html create mode 100644 src/app/voting/participate/voting-participate.component.scss create mode 100644 src/app/voting/participate/voting-participate.component.ts create mode 100644 src/app/voting/voting-status/voting-status.component.html create mode 100644 src/app/voting/voting-status/voting-status.component.scss create mode 100644 src/app/voting/voting-status/voting-status.component.ts create mode 100644 src/app/voting/voting.component.html create mode 100644 src/app/voting/voting.component.scss create mode 100644 src/app/voting/voting.component.ts create mode 100644 src/assets/.gitkeep create mode 100644 src/assets/fonts/PPTelegraf-Bold.ttf create mode 100644 src/assets/fonts/PPTelegraf-Light.ttf create mode 100644 src/assets/fonts/PPTelegraf-Medium.ttf create mode 100644 src/assets/fonts/PPTelegraf-Regular.ttf create mode 100644 src/assets/fonts/PPTelegraf-SemiBold.ttf create mode 100644 src/assets/i18n/de.json create mode 100644 src/assets/i18n/en.json create mode 100644 src/assets/i18n/es.json create mode 100644 src/assets/i18n/fr.json create mode 100644 src/assets/i18n/nl.json create mode 100644 src/assets/i18n/pt.json create mode 100644 src/assets/i18n/ru.json create mode 100644 src/assets/icons/icon-128x128.png create mode 100644 src/assets/icons/icon-144x144.png create mode 100644 src/assets/icons/icon-152x152.png create mode 100644 src/assets/icons/icon-192x192.png create mode 100644 src/assets/icons/icon-384x384.png create mode 100644 src/assets/icons/icon-512x512.png create mode 100644 src/assets/icons/icon-72x72.png create mode 100644 src/assets/icons/icon-96x96.png create mode 100644 src/assets/icons/wallet.svg create mode 100644 src/assets/icons/wallet_whitemode.svg create mode 100644 src/assets/img/favicon/android-chrome-192x192.png create mode 100644 src/assets/img/favicon/android-chrome-512x512.png create mode 100644 src/assets/img/favicon/apple-touch-icon.png create mode 100644 src/assets/img/favicon/favicon-16x16.png create mode 100644 src/assets/img/favicon/favicon-32x32.png create mode 100644 src/assets/img/favicon/favicon.ico create mode 100644 src/assets/img/favicon/mstile-150x150.png create mode 100644 src/assets/logo.svg create mode 100644 src/assets/logos/LogoFull_dark.svg create mode 100644 src/assets/logos/LogoFull_white.svg create mode 100644 src/assets/logos/Logo_dark.webp create mode 100644 src/assets/logos/Logo_light.webp create mode 100644 src/assets/logos/qubic_wallet_dark.svg create mode 100644 src/assets/logos/qubic_wallet_light.svg create mode 100644 src/environments/environment.prod.ts create mode 100644 src/environments/environment.ts create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/manifest.webmanifest create mode 100644 src/site.webmanifest create mode 100644 src/styles.scss create mode 100644 src/vars.scss create mode 100644 transloco.config.js create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.spec.json create mode 100644 yarn.lock diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9d67b10 --- /dev/null +++ b/LICENSE @@ -0,0 +1,707 @@ +Permission is hereby granted, perpetual, worldwide, non-exclusive, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + + 1. The Software cannot be used in any form or in any substantial portions for development, maintenance and for any other purposes, in the military sphere and in relation to military products, + including, but not limited to: + + a. any kind of armored force vehicles, missile weapons, warships, artillery weapons, air military vehicles (including military aircrafts, combat helicopters, military drones aircrafts), + air defense systems, rifle armaments, small arms, firearms and side arms, melee weapons, chemical weapons, weapons of mass destruction; + + b. any special software for development technical documentation for military purposes; + + c. any special equipment for tests of prototypes of any subjects with military purpose of use; + + d. any means of protection for conduction of acts of a military nature; + + e. any software or hardware for determining strategies, reconnaissance, troop positioning, conducting military actions, conducting special operations; + + f. any dual-use products with possibility to use the product in military purposes; + + g. any other products, software or services connected to military activities; + + h. any auxiliary means related to abovementioned spheres and products. + + + 2. The Software cannot be used as described herein in any connection to the military activities. A person, a company, or any other entity, which wants to use the Software, + shall take all reasonable actions to make sure that the purpose of use of the Software cannot be possibly connected to military purposes. + + + 3. The Software cannot be used by a person, a company, or any other entity, activities of which are connected to military sphere in any means. If a person, a company, or any other entity, + during the period of time for the usage of Software, would engage in activities, connected to military purposes, such person, company, or any other entity shall immediately stop the usage + of Software and any its modifications or alterations. + + + 4. Abovementioned restrictions should apply to all modification, alteration, merge, and to other actions, related to the Software, regardless of how the Software was changed due to the + abovementioned actions. + + +The above copyright notice and this permission notice shall be included in all copies or substantial portions, modifications and alterations of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7a6f8fe --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# qubic.li - Wallet + +A simple wallet for the QUBIC Network. Find more about QUBIC on https://doc.qubic.world/ or visit us on https://qubic.li. +To join the QUBIC Community on discord use this link http://discord.gg/2vDMR8m. + +## Local dev +To dev it locally use this: + +```bash +yarn install + +# if you want to use local express proxy for api requests, run in one terminal: +yarn run start-api-proxy + +# start the app +yarn run start +``` + +## License +As we use some parts from the 451 Package to our Wallet also apply the Anti-Military License. See https://github.com/computor-tools/qubic-js +Further our Wallet Code is protected by the AGPL-3.0 License. You may use our Source-Code for what you need to do business. + +## Installation +User either our Online Version on https://wallet.qubic.li or one of the Packages provided on our Website. + +## Limited Support +We cannot support you in any case. You are welcome to provide updates, bugfixes or other code changes by pull requests. diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..b2c5389 --- /dev/null +++ b/angular.json @@ -0,0 +1,118 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "yarn", + "analytics": false + }, + "newProjectRoot": "projects", + "projects": { + "qubic-wallet": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/qubic-wallet", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": [ + "zone.js" + ], + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + "src/favicon.ico", + "src/assets", + "src/manifest.webmanifest" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [], + "serviceWorker": true, + "ngswConfigPath": "ngsw-config.json" + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "1.6kb", + "maximumError": "2mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all", + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "browserTarget": "qubic-wallet:build:production" + }, + "development": { + "browserTarget": "qubic-wallet:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "qubic-wallet:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": [ + "zone.js", + "zone.js/testing" + ], + "tsConfig": "tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": [ + "src/favicon.ico", + "src/assets", + "src/manifest.webmanifest" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [] + } + } + } + } + } +} diff --git a/app.js b/app.js new file mode 100644 index 0000000..392a070 --- /dev/null +++ b/app.js @@ -0,0 +1,126 @@ +const {app, BrowserWindow} = require('electron') + +if (require('electron-squirrel-startup')) return; + +// this should be placed at top of main.js to handle setup events quickly +if (handleSquirrelEvent()) { + // squirrel event handled and app will exit in 1000ms, so don't do anything else + return; +} + +function handleSquirrelEvent() { + if (process.argv.length === 1) { + return false; + } + + const ChildProcess = require('child_process'); + const path = require('path'); + + const appFolder = path.resolve(process.execPath, '..'); + const rootAtomFolder = path.resolve(appFolder, '..'); + const updateDotExe = path.resolve(path.join(rootAtomFolder, 'Update.exe')); + const exeName = path.basename(process.execPath); + + const spawn = function(command, args) { + let spawnedProcess, error; + + try { + spawnedProcess = ChildProcess.spawn(command, args, {detached: true}); + } catch (error) {} + + return spawnedProcess; + }; + + const spawnUpdate = function(args) { + return spawn(updateDotExe, args); + }; + + const squirrelEvent = process.argv[1]; + switch (squirrelEvent) { + case '--squirrel-install': + case '--squirrel-updated': + // Optionally do things such as: + // - Add your .exe to the PATH + // - Write to the registry for things like file associations and + // explorer context menus + + // Install desktop and start menu shortcuts + spawnUpdate(['--createShortcut', exeName]); + + setTimeout(app.quit, 1000); + return true; + + case '--squirrel-uninstall': + // Undo anything you did in the --squirrel-install and + // --squirrel-updated handlers + + // Remove desktop and start menu shortcuts + spawnUpdate(['--removeShortcut', exeName]); + + setTimeout(app.quit, 1000); + return true; + + case '--squirrel-obsolete': + // This is called on the outgoing version of your app before + // we update to the new version - it's the opposite of + // --squirrel-updated + + app.quit(); + return true; + } +}; + + +const net = require("net") + const url = require("url"); + const path = require("path"); + + let mainWindow + + function createWindow () { + mainWindow = new BrowserWindow({ + width: 1550, + height: 750, + //frame: false, + titleBarStyle: 'hidden', + webPreferences: { + nodeIntegration: true, + contextIsolation: false + }, + icon: path.join(__dirname, 'reqs/qli.ico') + }); + + mainWindow.loadURL( + url.format({ + pathname: path.join(__dirname, `/dist/qubic-wallet/index.html`), + protocol: "file:", + slashes: true + }) + ); + + mainWindow.removeMenu(); + mainWindow.setMenu(null); + + mainWindow.webContents.setWindowOpenHandler((details) => { + require("electron").shell.openExternal(details.url); + return { action: 'deny' } + }) + + // Open the DevTools. + //mainWindow.webContents.openDevTools() + + mainWindow.on('closed', function () { + mainWindow = null + }) + + } + + app.on('ready', createWindow) + + app.on('window-all-closed', function () { + if (process.platform !== 'darwin') app.quit() + }) + + app.on('activate', function () { + if (mainWindow === null) createWindow() + }) \ No newline at end of file diff --git a/dev-proxy.js b/dev-proxy.js new file mode 100644 index 0000000..1ce8f13 --- /dev/null +++ b/dev-proxy.js @@ -0,0 +1,41 @@ +var express = require('express'), + request = require('request'), + bodyParser = require('body-parser'), + app = express(); + +var myLimit = typeof(process.argv[2]) != 'undefined' ? process.argv[2] : '500kb'; +console.log('Using limit: ', myLimit); + +app.use(bodyParser.json({limit: myLimit})); + +app.all('*', function (req, res, next) { + + // allow CORS + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE"); + res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers')); + + if (req.method === 'OPTIONS') { + // CORS Preflight + res.send(); + } else { + var targetURL = "https://api.qubic.li"; // target API to send request to + if (!targetURL) { + res.send(500, { error: 'There is no Target-Endpoint header in the request' }); + return; + } + console.log("API CALL: " + req.method + "\t" + targetURL + req.url); + request({ url: targetURL + req.url, method: req.method, json: req.body, headers: {'Authorization': req.header('Authorization')} }, + function (error, response, body) { + if (error) { + console.error('error: ' + response.statusCode) + } + }).pipe(res); + } +}); + +app.set('port', 7003); + +app.listen(app.get('port'), function () { + console.log('Proxy server listening on port ' + app.get('port')); +}); \ No newline at end of file diff --git a/forge.config.js b/forge.config.js new file mode 100644 index 0000000..8afd09a --- /dev/null +++ b/forge.config.js @@ -0,0 +1,29 @@ +module.exports = { + packagerConfig: { + icon: 'reqs/qli' + }, + pluginOptions: { + electronBuilder: { + nodeIntegration: true + } + }, + rebuildConfig: {}, + makers: [ + { + name: '@electron-forge/maker-squirrel', + config: {}, + }, + { + name: '@electron-forge/maker-zip', + platforms: ['darwin'], + }, + { + name: '@electron-forge/maker-deb', + config: {}, + }, + { + name: '@electron-forge/maker-rpm', + config: {}, + }, + ], +}; diff --git a/ngsw-config.json b/ngsw-config.json new file mode 100644 index 0000000..f8bf210 --- /dev/null +++ b/ngsw-config.json @@ -0,0 +1,30 @@ +{ + "$schema": "./node_modules/@angular/service-worker/config/schema.json", + "index": "/index.html", + "assetGroups": [ + { + "name": "app", + "installMode": "prefetch", + "resources": { + "files": [ + "/favicon.ico", + "/index.html", + "/manifest.webmanifest", + "/*.css", + "/*.js" + ] + } + }, + { + "name": "assets", + "installMode": "lazy", + "updateMode": "prefetch", + "resources": { + "files": [ + "/assets/**", + "/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)" + ] + } + } + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3c77d52 --- /dev/null +++ b/package.json @@ -0,0 +1,80 @@ +{ + "name": "qubic-wallet", + "version": "2.0.2", + "main": "app.js", + "author": "qubic", + "description": "Qubic - Wallet - Send Qu's around the globe.", + "scripts": { + "ng": "ng", + "start": "ng serve --open", + "start-public-access": "ng serve --host 0.0.0.0 --open", + "start-api-proxy": "node dev-proxy.js", + "start-electron": "ng build --base-href ./ && electron .", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test", + "package": "electron-forge package", + "make": "electron-forge make", + "app:dir": "electron-builder --dir", + "app:dist": "electron-builder" + }, + "private": true, + "dependencies": { + "@angular/animations": "^16.2.8", + "@angular/cdk": "^16.2.7", + "@angular/common": "^16.2.8", + "@angular/compiler": "^16.2.8", + "@angular/core": "^16.2.8", + "@angular/forms": "^16.2.8", + "@angular/material": "^16.2.7", + "@angular/platform-browser": "^16.2.8", + "@angular/platform-browser-dynamic": "^16.2.8", + "@angular/router": "^16.2.8", + "@angular/service-worker": "^16.2.8", + "@electron/rebuild": "^3.3.0", + "@ngneat/transloco": "^5.0.0", + "@ngneat/transloco-persist-lang": "^5.0.0", + "@ngneat/transloco-utils": "^5.0.0", + "angularx-qrcode": "^16.0.2", + "bignumber.js": "^9.1.1", + "electron-remote": "^1.3.0", + "electron-squirrel-startup": "^1.0.0", + "net": "^1.0.2", + "ngx-device-detector": "^6.0.2", + "ngx-file-drop": "^16.0.0", + "qrcode": "^1.5.3", + "qubic-ts-library": "^0.0.6", + "rxjs": "~7.5.0", + "tslib": "^2.3.0", + "zone.js": "0.13.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^16.2.5", + "@angular/cli": "~16.2.5", + "@angular/compiler-cli": "^16.2.8", + "@electron-forge/cli": "^6.0.4", + "@electron-forge/maker-deb": "^6.0.4", + "@electron-forge/maker-rpm": "^6.0.4", + "@electron-forge/maker-squirrel": "^6.0.4", + "@electron-forge/maker-zip": "^6.0.4", + "@types/jasmine": "~5.1.0", + "@types/qrcode": "1.5.0", + "electron": "^26.3.0", + "electron-builder": "^24.6.4", + "express": "^4.18.2", + "jasmine-core": "~5.1.1", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "request": "^2.88.2", + "typescript": "5.1" + }, + "build": { + "appId": "qubic.li.wallet", + "mac": { + "category": "business" + } + } +} diff --git a/reqs/qli.ico b/reqs/qli.ico new file mode 100644 index 0000000000000000000000000000000000000000..551df321f6d516efc57fd73e7d89bd78a799741e GIT binary patch literal 12572 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 literal 0 HcmV?d00001 diff --git a/reqs/qli.png b/reqs/qli.png new file mode 100644 index 0000000000000000000000000000000000000000..4d361b5b0bbe26fcbf7ec07b760bf614a238895c GIT binary patch literal 12599 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

3BbSd{fgx%E<(M0cl_{U2WaM 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 rL \ No newline at end of file diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 0000000..4e49c22 --- /dev/null +++ b/src/app/app.component.scss @@ -0,0 +1,36 @@ +.example-container { + display: flex; + flex-direction: column; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + } + + .example-is-mobile .example-toolbar { + position: fixed; + /* Make sure the toolbar will stay on top of the content as it scrolls past. */ + z-index: 2; + } + + h1.example-app-name { + margin-left: 8px; + } + + .example-sidenav-container { + /* When the sidenav is not fixed, stretch the sidenav container to fill the available space. This + causes `` to act as our scrolling element for desktop layouts. */ + flex: 1; + } + + .example-is-mobile .example-sidenav-container { + /* When the sidenav is fixed, don't constrain the height of the sidenav container. This allows the + `` to be our scrolling element for mobile layouts. */ + flex: 1 0 auto; + } + + .windowBorder { + border: 1px solid gray; + } + \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..19351db --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,57 @@ +import { ChangeDetectorRef, Component } from '@angular/core'; +import {MediaMatcher} from '@angular/cdk/layout'; +import { ApiService } from './services/api.service'; +import { DeviceDetectorService, DeviceInfo } from 'ngx-device-detector'; +import { ThemeService } from './services/theme.service'; +import { QubicService } from './services/qubic.service'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) +export class AppComponent { + mobileQuery!: MediaQueryList; + title = 'qubic-wallet'; + + private deviceInfo!: DeviceInfo; + public isMobile = false; + public isDesktop = false; + private bridgeConnected = false; + private _mobileQueryListener!: () => void; + public isElectron = false; + + constructor(public themeService: ThemeService, private changeDetectorRef: ChangeDetectorRef, private media: MediaMatcher, api: ApiService, private deviceService: DeviceDetectorService, private q: QubicService) { + this.checkSize(); + this.init(); + + if ((window).require) { + this.isElectron = true; + } + + } + + init() { + addEventListener( + "resize" + , () => { + this.checkSize(); + } + ); + } + + checkSize() { + this.mobileQuery = this.media.matchMedia('(max-width: 600px)'); + this._mobileQueryListener = () => this.changeDetectorRef.detectChanges(); + this.mobileQuery.addListener(this._mobileQueryListener); + this.deviceInfo = this.deviceService.getDeviceInfo(); + this.isMobile = this.deviceService.isMobile(); + this.isDesktop = this.deviceService.isDesktop(); + + + } + + ngOnDestroy(): void { + this.mobileQuery.removeListener(this._mobileQueryListener); + } +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..5220cac --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,186 @@ +import { NgModule, isDevMode } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { MainComponent } from './main/main.component'; +import { MatInputModule } from '@angular/material/input'; +import { MatButtonModule } from '@angular/material/button'; +import { MatSelectModule } from '@angular/material/select'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatCardModule } from '@angular/material/card'; +import { ReactiveFormsModule } from '@angular/forms'; +import { NavigationComponent } from './navigation/navigation.component'; +import { LayoutModule } from '@angular/cdk/layout'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { PaymentComponent } from './payment/payment.component'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { WalletService } from './services/wallet.service'; +import { LockComponent } from './lock/lock.component'; +import { MatDialogModule, MAT_DIALOG_DEFAULT_OPTIONS } from '@angular/material/dialog'; +import { LockConfirmDialog } from './lock/confirm-lock/confirm-lock.component'; +import { LoadConfigDialog } from './lock/load-config/load-config.component'; +import { ExportConfigDialog } from './lock/export-config/export-config.component'; +import { UnLockComponent } from './lock/unlock/unlock.component'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { SeedEditDialog } from './main/edit-seed/seed-edit.component'; +import { MatTableModule} from '@angular/material/table'; +import {MatSortModule} from '@angular/material/sort' +import { ConfigErrorComponent } from './lock/config-error/config-error.component'; +import { NotifysComponent } from './notifys/notifys.component'; +import { ConfirmDialog } from './core/confirm-dialog/confirm-dialog.component'; +import { OkDialog } from './core/ok-dialog/ok-dialog.component'; +import { RevealSeedDialog } from './main/reveal-seed/reveal-seed.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { AuthInterceptor } from './services/auth-interceptor'; +import { ApiService } from './services/api.service'; +import { SettingsComponent } from './settings/settings.component'; +import { BalanceComponent } from './balance/balance.component'; +import { QRCodeModule } from 'angularx-qrcode'; +import { QrReceiveDialog } from './main/qr-receive/qr-receive.component'; +import { TranslocoRootModule } from './transloco-root.module'; +import { LanguageChooserComponent } from './core/language-chooser/language-chooser.component'; +import { UpdaterService } from './services/updater-service'; +import {MatTabsModule} from '@angular/material/tabs'; +import { AccountComponent } from './settings/account/account.component'; +import { ExportComponent } from './settings/export/export.component'; +import { NgxFileDropModule } from 'ngx-file-drop'; +import { VotingComponent } from './voting/voting.component'; +import { VotingParticipateComponent } from './voting/participate/voting-participate.component'; +import { VotingCreateComponent } from './voting/create/voting-create.component'; +import {MatStepperModule} from '@angular/material/stepper'; +import { VotingStatusComponent } from './voting/voting-status/voting-status.component'; +import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; +import { IpoComponent } from './ipo/ipo.component'; +import { PlaceBidComponent } from './ipo/place-bid/place-bid.component'; +import { TransferStatusComponent } from './core/transfer-status/transfer-status.component'; +import { SettingsGeneralComponent } from './settings/general/general.component'; +import {MatSlideToggleModule} from '@angular/material/slide-toggle'; +import { QubicService } from './services/qubic.service'; +import { DecimalPipe } from '@angular/common'; +import { TokenService } from './services/token.service'; +import { VisibilityService } from './services/visibility.service'; +import { AssetsDialog } from './main/assets/assets.component'; +import {MatMenuModule} from "@angular/material/menu"; +import { AssetsComponent } from './assets/assets.component'; +import { TransactionService } from './services/transaction.service'; +import { EnvironmentService } from './services/env.service'; +import { ServiceWorkerModule } from '@angular/service-worker'; +import { WelcomeComponent } from './public/welcome/welcome.component'; +import { CreateVaultComponent } from './public/create-vault/create-vault.component'; +import { PublicUnLockComponent } from './public/unlock/unlock.component'; +import { ImportVaultComponent } from './public/import/import.component'; +import { FileSelectorComponent } from './common/file-selector/file-selector.component'; + + + +/** Http interceptor providers in outside-in order */ +export const httpInterceptorProviders = [ + { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }, +]; + +@NgModule({ + declarations: [ + AppComponent, + MainComponent, + NavigationComponent, + PaymentComponent, + LockComponent, + LockConfirmDialog, + UnLockComponent, + SeedEditDialog, + ConfigErrorComponent, + NotifysComponent, + ConfirmDialog, + OkDialog, + LoadConfigDialog, + ExportConfigDialog, + RevealSeedDialog, + SettingsComponent, + BalanceComponent, + QrReceiveDialog, + LanguageChooserComponent, + AccountComponent, + ExportComponent, + VotingComponent, + VotingParticipateComponent, + VotingCreateComponent, + VotingStatusComponent, + IpoComponent, + PlaceBidComponent, + TransferStatusComponent, + SettingsGeneralComponent, + AssetsDialog, + AssetsComponent, + WelcomeComponent, + CreateVaultComponent, + PublicUnLockComponent, + ImportVaultComponent, + FileSelectorComponent + ], + imports: [ + BrowserModule, + AppRoutingModule, + MatInputModule, + MatCheckboxModule, + MatButtonModule, + MatSelectModule, + MatRadioModule, + MatCardModule, + ReactiveFormsModule, + LayoutModule, + MatToolbarModule, + MatSidenavModule, + MatIconModule, + MatListModule, + BrowserAnimationsModule, + MatDialogModule, + MatSnackBarModule, + MatTableModule, + MatSortModule, + ClipboardModule, + MatTooltipModule, + HttpClientModule, + QRCodeModule, + TranslocoRootModule, + MatTabsModule, + NgxFileDropModule, + MatStepperModule, + MatProgressSpinnerModule, + MatSlideToggleModule, + MatMenuModule, + ServiceWorkerModule.register('ngsw-worker.js', { + enabled: !isDevMode(), + // Register the ServiceWorker as soon as the application is stable + // or after 30 seconds (whichever comes first). + registrationStrategy: 'registerWhenStable:30000' + }) + ], + + providers: [ + VisibilityService, + TokenService, + { + provide: WalletService, + useFactory: () => new WalletService(), + deps: [] + }, + AuthInterceptor, + ApiService, + UpdaterService, + QubicService, + DecimalPipe, + EnvironmentService, + { provide: MAT_DIALOG_DEFAULT_OPTIONS, useValue: { hasBackdrop: true } }, + httpInterceptorProviders, + TransactionService + ], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/src/app/assets/assets.component.html b/src/app/assets/assets.component.html new file mode 100644 index 0000000..f3b94e2 --- /dev/null +++ b/src/app/assets/assets.component.html @@ -0,0 +1,206 @@ + +

+

{{ t("assetsComponent.title") }}

+ + +
+ + +

{{ t("assetsComponent.overview.title") }}

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{ t("assetsComponent.table.publicId") }} +
+ {{ getSeedAlias(asset.publicId) }} {{ asset.publicId }} +
+
{{ t("assetsComponent.table.contractIndex") }} {{ asset.contractIndex }} {{ t("assetsComponent.table.assetName") }} {{ asset.assetName }} {{ t("assetsComponent.table.contractName") }} {{ asset.contractName }} {{ t("assetsComponent.table.ownedAmount") }} {{ asset.ownedAmount }} {{ t("assetsComponent.table.possessedAmount") }} {{ asset.possessedAmount }} {{ t("assetsComponent.table.tick") }} {{ asset.tick }} {{ t("assetsComponent.table.reportingNodes") }} {{ asset.reportingNodes?.join(', ') }}{{ t("assetsComponent.table.issuerIdentity") }} + + {{ t("assetsComponent.buttons.send") }} + +
+
+ +
+ + + + +
+
+
+ {{ t("assetsComponent.noAssets") }} +
+
+ + + + +

{{ t("assetsComponent.form.info") }}

+
{{ t("assetsComponent.form.fees") }}
+ +
+
+
+ + {{ t("assetsComponent.form.select") }} + + + {{ asset.assetName }} ({{ asset.ownedAmount }}) + {{ getSeedAlias(asset.publicId) }} {{ asset.publicId }} + + + + {{ t("assetsComponent.form.select.error") }} + + +
+
+
+
+ + {{ t("assetsComponent.form.placeholder") }} + + + {{ t("assetsComponent.form.placeholder.error") }} + + +
+
+
+
+ + {{ t("assetsComponent.form.amount") }} + + + {{ t("assetsComponent.form.amount.error") }} + + + {{ t("assetsComponent.form.amount.value.error") }} + + + {{ t("assetsComponent.form.amount.max.error") }} + + +
+
+ + {{ t("assetsComponent.form.tick") }} + + + + {{ t("assetsComponent.form.tick.error") }} + + + {{ t("assetsComponent.form.tick.min", {currentTick: currentTick}) }} + + +
+
+ +
{{ t("assetsComponent.form.balance") }} {{ getBalanceAfterFees() | number: '1.0-0' }} {{ t("general.currency") }} +
+
{{ t("assetsComponent.form.buttons.error.balance") }} +
+ + + + + + +
+
+
+
+ +
+ diff --git a/src/app/assets/assets.component.scss b/src/app/assets/assets.component.scss new file mode 100644 index 0000000..9086d22 --- /dev/null +++ b/src/app/assets/assets.component.scss @@ -0,0 +1,65 @@ +.full-width { + width: 100%; +} + + +.asset-card { + display: flex; + flex-direction: column; + justify-content: flex-start; + flex-wrap: wrap; + margin: 20px 0; + overflow-x: auto; + + + .row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + + .col { + flex: 1; + margin-right: 20px; + margin-bottom: 15px; + } + + .col:last-child { + margin-right: 0; + } + + .padding button { + margin: 10px; + padding: 10px 40px; + } +} + +.sendAssets-card { + margin-top: 20px; + + .row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + + .col { + flex: 1; + margin-right: 20px; + margin-bottom: 15px; + } + + .transaction-fee { + margin-bottom: 20px; + } +} + +.error-message { + color: red; +} + +.no-assets-message { + padding: 10px; + text-align: center; +} + diff --git a/src/app/assets/assets.component.spec.ts b/src/app/assets/assets.component.spec.ts new file mode 100644 index 0000000..fdba9a0 --- /dev/null +++ b/src/app/assets/assets.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AssetsComponent } from './assets.component'; +import {size} from "@ngneat/transloco"; + +describe('AssetsComponent', () => { + let component: AssetsComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [AssetsComponent] + }); + fixture = TestBed.createComponent(AssetsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); + diff --git a/src/app/assets/assets.component.ts b/src/app/assets/assets.component.ts new file mode 100644 index 0000000..b5e91ff --- /dev/null +++ b/src/app/assets/assets.component.ts @@ -0,0 +1,268 @@ +import { Component, OnInit } from '@angular/core'; +import { QubicAsset } from "../services/api.model"; +import { ApiService } from "../services/api.service"; +import { FormControl, FormGroup, Validators } from "@angular/forms"; +import { WalletService } from '../services/wallet.service'; +import { QubicTransferAssetPayload } from 'qubic-ts-library/dist/qubic-types/transacion-payloads/QubicTransferAssetPayload'; +import { QubicTransaction } from 'qubic-ts-library/dist/qubic-types/QubicTransaction'; +import { QubicDefinitions } from 'qubic-ts-library/dist/QubicDefinitions'; +import { lastValueFrom } from 'rxjs'; +import { MatDialog } from "@angular/material/dialog"; +import { UpdaterService } from "../services/updater-service"; +import { UnLockComponent } from '../lock/unlock/unlock.component'; +import { TransactionService } from '../services/transaction.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { PublicKey } from 'qubic-ts-library/dist/qubic-types/PublicKey'; +import {environment} from "../../environments/environment"; + +@Component({ + selector: 'app-assets', + templateUrl: './assets.component.html', + styleUrls: ['./assets.component.scss'] +}) + +export class AssetsComponent implements OnInit { + + displayedColumns: string[] = ['publicId', 'contractIndex', 'assetName', 'contractName', 'ownedAmount', 'possessedAmount', 'tick', 'reportingNodes','issuerIdentity','send']; + public assets: QubicAsset[] = []; + public currentTick = 0; + public tickOverwrite = false; + + sendForm: FormGroup; + isAssetsLoading: boolean = false; + isSending: boolean = false; + showSendForm: boolean = false; + + constructor( + private apiService: ApiService, + public walletService: WalletService, + public transactionService: TransactionService, + private updaterService: UpdaterService, + private t: TranslocoService, + private _snackBar: MatSnackBar, + private dialog: MatDialog) { + this.sendForm = new FormGroup({ + destinationAddress: new FormControl('', Validators.required), + amount: new FormControl('', Validators.required), + tick: new FormControl('', Validators.required), + assetSelect: new FormControl('', Validators.required), + }); + + + // subscribe to config changes to receive asset updates + this.walletService.onConfig.subscribe(c => { + this.assets = this.walletService.getSeeds().flatMap(m => m.assets).filter(f => f).map(m => m); + }); + + // const amountControl = this.sendForm.get('amount'); + const assetSelectControl = this.sendForm.get('assetSelect'); + + // todo: check, this causes a max stack call loop + // why is this needed? + + // if (amountControl) { + // amountControl.valueChanges.subscribe(() => { + // // this.updateAmountValidator(); + // }); + // } + + if (assetSelectControl) { + assetSelectControl.valueChanges.subscribe(() => { + this.updateAmountValidator(); + }); + } + } + + updateAmountValidator(): void { + const assetSelectControl = this.sendForm.get('assetSelect'); + const amountControl = this.sendForm.get('amount'); + + if (assetSelectControl && amountControl) { + const selectedAsset = assetSelectControl.value; + const maxAmount = selectedAsset ? selectedAsset.ownedAmount : 0; + + amountControl.setValidators([ + Validators.required, + Validators.min(1), + Validators.max(maxAmount) + ]); + + amountControl.updateValueAndValidity(); + } + } + + ngOnInit() { + this.loadAssets(); + + this.updaterService.currentTick.subscribe(tick => { + this.currentTick = tick; + this.sendForm.controls['tick'].addValidators(Validators.min(tick)); + if (!this.tickOverwrite) { + this.sendForm.controls['tick'].setValue(tick + this.walletService.getSettings().tickAddition); + } + }) + } + + + refreshData(): void { + this.loadAssets(true); + } + + loadAssets(force: boolean = false) { + if (force || this.assets.length <= 0) { + this.isAssetsLoading = true; + this.updaterService.forceLoadAssets((r) => { + this.isAssetsLoading = false; + }); + // timeout because of unpropper handling in forceLoadAssets :() + window.setTimeout(() => { + this.isAssetsLoading = false; + }, 5000); + } + } + + handleTickEdit(): void { + const currentTickValue = this.sendForm.controls['tick'].value; + if (currentTickValue < this.currentTick) { + this.sendForm.controls['tick'].setValue(this.currentTick + this.walletService.getSettings().tickAddition); + } + this.tickOverwrite = !this.tickOverwrite; + } + + getSeedAlias(publicId: string) { + return this.walletService.getSeed(publicId)?.alias; + } + + openIssuerIdentity(issuerIdentity: string): void { + const url = `https://app.qubic.li/network/explorer/address/${issuerIdentity}`; + window.open(url, '_blank'); + } + + getBalanceAfterFees(): number { + var balanceOfSelectedId = this.walletService.getSeed((this.sendForm.controls['assetSelect']?.value)?.publicId)?.balance ?? 0; + const balanceAfterFees = BigInt(balanceOfSelectedId) - BigInt(environment.assetsFees); + return Number(balanceAfterFees); + } + + openSendForm(selectedAsset?: QubicAsset): void { + this.showSendForm = true; + + this.tickOverwrite = false; + this.sendForm.controls['tick'].setValue(this.currentTick + this.walletService.getSettings().tickAddition); + + const assetSelectControl = this.sendForm.get('assetSelect'); + + if (assetSelectControl) { + if (selectedAsset) { + assetSelectControl.setValue(selectedAsset); + } else if (this.assets.length > 0) { + assetSelectControl.setValue(this.assets[0]); + } + this.updateAmountValidator(); + } + } + + async onSubmitSendForm() { + if (this.sendForm.valid) { + // logic + this.isSending = true; + try { + await this.sendAsset(); + } catch (er) { + console.error(er); + } + finally { + this.isSending = false; + } + } + } + + cancelSendForm(): void { + this.showSendForm = false; + this.tickOverwrite = false; + this.sendForm.reset(); + } + + async sendAsset() { + + // todo: form/input validation + + + // todo: create central transaction service to send transactions!!!! + + // sample send asset function + const assetSelectControl = this.sendForm.get('assetSelect'); + const amountControl = this.sendForm.get('amount'); + const destinationAddressControl = this.sendForm.get('destinationAddress'); + + if (!assetSelectControl || !amountControl || !destinationAddressControl) { + // todo: error handling + return; + } + + const sourceAsset = assetSelectControl.value; + + const sourcePublicKey = sourceAsset.publicId; // must be the sender/owner of th easset + const assetName = sourceAsset.assetName; // must be the name of the asset to be transfered + const numberOfUnits = amountControl.value; // must be the number of units to be transfered + const targetAddress = new PublicKey(destinationAddressControl.value); + + // verify target address + if(!(await targetAddress.verifyIdentity())){ + this._snackBar.open("INVALID RECEIVER ADDRESSS", this.t.translate('general.close'), { + duration: 10000, + panelClass: "error" + }); + return; + } + + let targetTick = this.sendForm.get("tick")?.value ?? 0; + // todo: think about if we want to let the user set a custom target tick + + if (!this.tickOverwrite || targetTick == 0) { + const currentTick = await lastValueFrom(this.apiService.getCurrentTick()); + targetTick = currentTick.tick + this.walletService.getSettings().tickAddition; // set tick to send tx + } + + // load the seed from wallet service + const signSeed = await this.walletService.revealSeed(sourcePublicKey); // must be the seed to sign the transaction + + const assetTransfer = new QubicTransferAssetPayload() + .setIssuer(sourceAsset.issuerIdentity) + .setPossessor(sourcePublicKey) + .setnewOwner(targetAddress) + .setAssetName(assetName) + .setNumberOfUnits(numberOfUnits); + + + // build and sign tx + const tx = new QubicTransaction().setSourcePublicKey(sourcePublicKey) + .setDestinationPublicKey(QubicDefinitions.QX_ADDRESS) // a transfer should go the QX SC + .setAmount(QubicDefinitions.QX_TRANSFER_ASSET_FEE) + .setTick(targetTick) // just a fake tick + .setInputType(QubicDefinitions.QX_TRANSFER_ASSET_INPUT_TYPE) + .setPayload(assetTransfer); + + await tx.build(signSeed); + + const publishResult = await this.transactionService.publishTransaction(tx); + + if (publishResult && publishResult.success) { + this._snackBar.open(this.t.translate('paymentComponent.messages.storedForPropagation', { tick: tx.tick }), this.t.translate('general.close'), { + duration: 0, + }); + this.showSendForm = false; + } + else { + this._snackBar.open(publishResult.message ?? this.t.translate('paymentComponent.messages.failedToSend'), this.t.translate('general.close'), { + duration: 10000, + panelClass: "error" + }); + } + } + + loadKey() { + const dialogRef = this.dialog.open(UnLockComponent, { restoreFocus: false }); + } +} diff --git a/src/app/balance/balance.component.html b/src/app/balance/balance.component.html new file mode 100644 index 0000000..d71e1d1 --- /dev/null +++ b/src/app/balance/balance.component.html @@ -0,0 +1,80 @@ + + + \ No newline at end of file diff --git a/src/app/balance/balance.component.scss b/src/app/balance/balance.component.scss new file mode 100644 index 0000000..a054761 --- /dev/null +++ b/src/app/balance/balance.component.scss @@ -0,0 +1,75 @@ +.alert { + border: 1px solid red; + padding: 5px; + margin: 5px; + font-weight: bold; + text-align: center; +} + +.noMoneyFlow { + text-decoration: line-through; +} + + +.transaction-list { + + .center { + text-align: center; + } + + display: flex; + flex-direction: row; + justify-content: flex-start; + flex-wrap: wrap; + align-items: center; + padding: 5px; + column-gap: 10px; + margin: 10px; + + .send-receive-indicator { + min-width: 98px; + text-align: right; + } + .receive { + color: green; + } + + .send { + color: red; + } + + .trans-date { + font-size: 0.9em; + } + + .trans-amount { + padding: 5px; + font-weight: bold; + min-width: 180px; + display: flex; + align-items: center; + + } + + .ownId { + font-weight: bold; + } + + .copy { + width: inherit; + + } + + + + + .copy span{ + word-break: break-all; + } +} + +.full-width { + width: 100%; +} + +/* see mobile styles in styles.css */ \ No newline at end of file diff --git a/src/app/balance/balance.component.ts b/src/app/balance/balance.component.ts new file mode 100644 index 0000000..bb9fccf --- /dev/null +++ b/src/app/balance/balance.component.ts @@ -0,0 +1,94 @@ +import { Component, OnInit } from '@angular/core'; +import { ApiService } from '../services/api.service'; +import { WalletService } from '../services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { BalanceResponse, Transaction } from '../services/api.model'; +import { FormControl } from '@angular/forms'; +import { UpdaterService } from '../services/updater-service'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-balance', + templateUrl: './balance.component.html', + styleUrls: ['./balance.component.scss'] +}) +export class BalanceComponent implements OnInit { + + public accountBalances: BalanceResponse[] = []; + public seedFilterFormControl: FormControl = new FormControl(); + public currentTick = 0; + public transactions: Transaction[] = []; + + constructor(private router: Router, private transloco: TranslocoService, private api: ApiService, private walletService: WalletService, private _snackBar: MatSnackBar, private us: UpdaterService) { + } + + ngOnInit(): void { + if(this.hasSeeds()){ + this.us.currentTick.subscribe(s => { + this.currentTick = s; + }); + this.us.internalTransactions.subscribe(txs => { + this.transactions = txs; + }); + this.us.currentBalance.subscribe(response => { + this.accountBalances = response; + }, errorResponse => { + this._snackBar.open(errorResponse.error, this.transloco.translate("general.close"), { + duration: 0, + panelClass: "error" + }); + }); + } + } + + getDate() { + return new Date(); + } + + getTotalBalance(estimated = false): number { + if(estimated) + return this.walletService.getSeeds().reduce((a,c) => a + Number(c.balance), 0); + else + return this.accountBalances.reduce((p, c) => p + (c.epochBaseAmount), 0); + } + + hasSeeds() { + return this.walletService.getSeeds().length > 0; + } + + // onlyUnique(value: Transaction, index:any, array:Transaction[]) { + // return array.findIndex((f: Transaction) => f.id === value.id) == index; + // } + + getTransactions(publicId: string | null = null): Transaction[] { + return this.transactions.filter(f => publicId == null || f.sourceId == publicId || f.destId == publicId); + // return this.accountBalances.flatMap((b) => b.transactions.filter(f => publicId == null || f.sourceId == publicId || f.destId == publicId)) + // .filter(this.onlyUnique) + // .sort((a,b) => { return (new Date(b.created)) - (new Date(a.created))}); + } + + isOwnId(publicId: string): boolean { + return this.walletService.getSeed(publicId) !== undefined; + } + + getSeedName(publicId: string): string { + var seed = this.walletService.getSeed(publicId); + if(seed !== undefined) + return '(' + seed.alias + ')'; + else + return ''; + } + + getSeeds() { + return this.walletService.getSeeds(); + } + + repeat(transaction: Transaction) { + this.router.navigate(['payment'], { + state: { + template: transaction + } + }); + } +} diff --git a/src/app/common/file-selector/file-selector.component.html b/src/app/common/file-selector/file-selector.component.html new file mode 100644 index 0000000..ebece5b --- /dev/null +++ b/src/app/common/file-selector/file-selector.component.html @@ -0,0 +1,23 @@ +
+ {{ selectedFile.name }} + + + {{ requredText }} + + +
diff --git a/src/app/common/file-selector/file-selector.component.scss b/src/app/common/file-selector/file-selector.component.scss new file mode 100644 index 0000000..2f08eb2 --- /dev/null +++ b/src/app/common/file-selector/file-selector.component.scss @@ -0,0 +1,8 @@ +.file-input { + display: none; +} +.file-selector { + display: flex; + flex-direction: column; + align-items: center; +} \ No newline at end of file diff --git a/src/app/common/file-selector/file-selector.component.ts b/src/app/common/file-selector/file-selector.component.ts new file mode 100644 index 0000000..a7badbd --- /dev/null +++ b/src/app/common/file-selector/file-selector.component.ts @@ -0,0 +1,30 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; + + + +@Component({ + selector: 'app-file-selector', + templateUrl: './file-selector.component.html', + styleUrls: ['./file-selector.component.scss'] +}) +export class FileSelectorComponent { + + public selectedFile: File | undefined = undefined; + + @Input() + public requredText: string = 'File required'; + + @Input() + public selectFileText: string = 'Select file'; + + @Output() + public fileSelected: EventEmitter = new EventEmitter(); + + onFileSelected(event: any) { + this.selectedFile = event?.target.files[0]; + if(this.selectFileText){ + this.fileSelected.emit(this.selectedFile!); + } + } + +} diff --git a/src/app/core/confirm-dialog/confirm-dialog.component.html b/src/app/core/confirm-dialog/confirm-dialog.component.html new file mode 100644 index 0000000..bce70b6 --- /dev/null +++ b/src/app/core/confirm-dialog/confirm-dialog.component.html @@ -0,0 +1,10 @@ +
+

{{ t("confirmDialog.title") }}

+ + {{message}} + + + + + +
\ No newline at end of file diff --git a/src/app/core/confirm-dialog/confirm-dialog.component.scss b/src/app/core/confirm-dialog/confirm-dialog.component.scss new file mode 100644 index 0000000..f89443a --- /dev/null +++ b/src/app/core/confirm-dialog/confirm-dialog.component.scss @@ -0,0 +1,18 @@ +form { + min-width: 500px; + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; + row-gap: 10px; + mat-form-field { + width:100%; + } + .seedInput { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width:100%; + } +} \ No newline at end of file diff --git a/src/app/core/confirm-dialog/confirm-dialog.component.ts b/src/app/core/confirm-dialog/confirm-dialog.component.ts new file mode 100644 index 0000000..bf6a421 --- /dev/null +++ b/src/app/core/confirm-dialog/confirm-dialog.component.ts @@ -0,0 +1,30 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { Component, Inject, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { IDecodedSeed, ISeed } from 'src/app/model/seed'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { UnLockComponent } from 'src/app/lock/unlock/unlock.component'; +import { TranslocoService } from '@ngneat/transloco'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from '../dialog-wrapper/dialog-wrapper'; + + +@Component({ + selector: 'qli-seed-edit', + templateUrl: './confirm-dialog.component.html', + styleUrls: ['./confirm-dialog.component.scss'] +}) +export class ConfirmDialog extends QubicDialogWrapper{ + + public message = this.transloco.translate("confirmDialog.confirmationText") + + constructor(renderer: Renderer2, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, private walletService: WalletService, dialog: Dialog, private fb: FormBuilder, private dialogRef: DialogRef, private _snackBar: MatSnackBar, private transloco: TranslocoService) { + super(renderer, themeService); + if (data?.message) { + this.message = data.message; + } + } +} diff --git a/src/app/core/dialog-wrapper/dialog-wrapper.ts b/src/app/core/dialog-wrapper/dialog-wrapper.ts new file mode 100644 index 0000000..e902879 --- /dev/null +++ b/src/app/core/dialog-wrapper/dialog-wrapper.ts @@ -0,0 +1,11 @@ +import { Component, Inject, Renderer2 } from '@angular/core'; +import { ThemeService } from 'src/app/services/theme.service'; + + +export class QubicDialogWrapper { + constructor(private renderer: Renderer2, public themeService: ThemeService) { + this.renderer.removeClass(document.body, 'dark'); + this.renderer.removeClass(document.body, 'light'); + this.renderer.addClass(document.body, this.themeService.isDarkTheme ? 'darkTheme' : 'light'); + } +} \ No newline at end of file diff --git a/src/app/core/language-chooser/language-chooser.component.html b/src/app/core/language-chooser/language-chooser.component.html new file mode 100644 index 0000000..6a1478b --- /dev/null +++ b/src/app/core/language-chooser/language-chooser.component.html @@ -0,0 +1,13 @@ + + + + + + + diff --git a/src/app/core/language-chooser/language-chooser.component.scss b/src/app/core/language-chooser/language-chooser.component.scss new file mode 100644 index 0000000..c94fd3f --- /dev/null +++ b/src/app/core/language-chooser/language-chooser.component.scss @@ -0,0 +1,7 @@ +mat-form-field { + width: 195px; +} + +.active-lang { + color: #00ccff; +} diff --git a/src/app/core/language-chooser/language-chooser.component.ts b/src/app/core/language-chooser/language-chooser.component.ts new file mode 100644 index 0000000..a05ec0f --- /dev/null +++ b/src/app/core/language-chooser/language-chooser.component.ts @@ -0,0 +1,48 @@ +import { Component, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { TranslocoService } from '@ngneat/transloco'; + +@Component({ + selector: 'qli-language-chooser', + templateUrl: './language-chooser.component.html', + styleUrls: ['./language-chooser.component.scss'] +}) +export class LanguageChooserComponent implements OnInit { + + browserLanguage = navigator.language.split('-')[0]; + supportedLanguagesDictionary: { [key: string]: string } = { + 'de': 'Deutsch', + 'en': 'English', + 'es': 'Español', + 'nl': 'Nederlands', + 'ru': 'Русский', + 'fr': 'Français', + 'pt': 'Português', + }; + + public selected: string = "en"; + + constructor(public translocoService: TranslocoService, public dialog: MatDialog) { } + + ngOnInit(): void { + if (Object.keys(this.supportedLanguagesDictionary).includes(this.browserLanguage)) { + this.selected = this.browserLanguage; + } else { + this.selected = 'en'; + } + // Den Transloco-Service im ngOnInit initialisieren + this.translocoService.setActiveLang(this.selected); + } + + getSupportedLanguages(): string[] { + return Object.keys(this.supportedLanguagesDictionary); + } + + changeLang(event: any): void { + this.translocoService.setActiveLang(event.value); + } + + isActiveLang(languageKey: string) { + return this.translocoService.getActiveLang() === languageKey; + } +} diff --git a/src/app/core/ok-dialog/ok-dialog.component.html b/src/app/core/ok-dialog/ok-dialog.component.html new file mode 100644 index 0000000..5f8bf73 --- /dev/null +++ b/src/app/core/ok-dialog/ok-dialog.component.html @@ -0,0 +1,9 @@ +
+

{{ t("okDialog.title") }}

+ + {{message}} + + + + +
\ No newline at end of file diff --git a/src/app/core/ok-dialog/ok-dialog.component.scss b/src/app/core/ok-dialog/ok-dialog.component.scss new file mode 100644 index 0000000..078d26d --- /dev/null +++ b/src/app/core/ok-dialog/ok-dialog.component.scss @@ -0,0 +1,24 @@ +.important { + display: flex; + align-items: center; + column-gap: 10px; + font-size: 1.5em; +} +form { + min-width: 500px; + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; + row-gap: 10px; + mat-form-field { + width:100%; + } + .seedInput { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width:100%; + } +} \ No newline at end of file diff --git a/src/app/core/ok-dialog/ok-dialog.component.ts b/src/app/core/ok-dialog/ok-dialog.component.ts new file mode 100644 index 0000000..af79e4e --- /dev/null +++ b/src/app/core/ok-dialog/ok-dialog.component.ts @@ -0,0 +1,51 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { Component, Inject, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from '../dialog-wrapper/dialog-wrapper'; + +@Component({ + selector: 'qli-ok-dialog', + templateUrl: './ok-dialog.component.html', + styleUrls: ['./ok-dialog.component.scss'] +}) +export class OkDialog extends QubicDialogWrapper{ + + public title = this.transloco.translate("okDialog.title"); + public message = "null"; + public button =this.transloco.translate("okDialog.buttons.confirm"); + + // constructor(renderer: Renderer2, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, private walletService: WalletService, dialog: Dialog, private fb: FormBuilder, private dialogRef: DialogRef, private _snackBar: MatSnackBar, private transloco: TranslocoService) { + // super(renderer, themeService); + + // if (data?.title) { + // this.title = data.title; + // } + // if (data?.message) { + // this.message = data.message; + // } + // if (data?.title) { + // this.button = data.button; + // } + // } + + constructor(renderer: Renderer2, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: DialogRef, private transloco: TranslocoService + ) { + super(renderer, themeService); + + if (data?.title) { + this.title = data.title; + } + if (data?.message) { + this.message = data.message; + } + if (data?.title) { + this.button = data.button; + } + } + +} diff --git a/src/app/core/transfer-status/transfer-status.component.html b/src/app/core/transfer-status/transfer-status.component.html new file mode 100644 index 0000000..98e3d63 --- /dev/null +++ b/src/app/core/transfer-status/transfer-status.component.html @@ -0,0 +1,50 @@ + +
+ + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/src/app/core/transfer-status/transfer-status.component.scss b/src/app/core/transfer-status/transfer-status.component.scss new file mode 100644 index 0000000..4a37763 --- /dev/null +++ b/src/app/core/transfer-status/transfer-status.component.scss @@ -0,0 +1,3 @@ +mat-form-field { + width: 100px; +} \ No newline at end of file diff --git a/src/app/core/transfer-status/transfer-status.component.ts b/src/app/core/transfer-status/transfer-status.component.ts new file mode 100644 index 0000000..75598ab --- /dev/null +++ b/src/app/core/transfer-status/transfer-status.component.ts @@ -0,0 +1,21 @@ +import { Component, Input } from '@angular/core'; +import {MatDialog} from '@angular/material/dialog'; +import { TranslocoService } from '@ngneat/transloco'; +import { Transaction } from 'src/app/services/api.model'; + + +@Component({ + selector: 'qli-transfer-status', + templateUrl: './transfer-status.component.html', + styleUrls: ['./transfer-status.component.scss'] +}) +export class TransferStatusComponent { + + @Input() + transaction!: Transaction; + + constructor(public translocoService: TranslocoService, public dialog: MatDialog){ + } + + +} diff --git a/src/app/guards/wallet-ready.guard.ts b/src/app/guards/wallet-ready.guard.ts new file mode 100644 index 0000000..38a2e18 --- /dev/null +++ b/src/app/guards/wallet-ready.guard.ts @@ -0,0 +1,9 @@ +import { inject } from '@angular/core'; +import { CanActivateFn, Router } from '@angular/router'; +import { WalletService } from '../services/wallet.service'; + +export const walletReadyGuard: CanActivateFn = (route, state) => { + const walletService = inject(WalletService); + const router: Router = inject(Router); + return walletService.getLockUnlockRoute(router); +}; diff --git a/src/app/ipo/ipo.component.html b/src/app/ipo/ipo.component.html new file mode 100644 index 0000000..430dfeb --- /dev/null +++ b/src/app/ipo/ipo.component.html @@ -0,0 +1,99 @@ + +
+

{{ t("ipoComponent.title") }}

+
+ {{ t("general.loading") }} +
+
+ {{ t("ipoComponent.noIpos") }} +
+
+ + +

{{ p.name }}

+ + + +
+

{{ t("ipoComponent.yourShares") }}

+ {{ t("ipoComponent.statusValid", {tick: getBidOverview(p.index).tick}) }} +
+ {{ bid.bids.length }} ({{ getTotalPrice(bid.bids) | number: '1.0-0'}} {{ + t("general.currency") }}) {{ t("ipoComponent.sharesFor") }} +
+ {{ bid.computorId }} {{ + getSeedName(bid.computorId) }} +
+
+
+
+

{{ t("ipoComponent.yourBids") }}

+
+ +
+
{{ transaction.price | number: '1.0-0' }} {{ + t("general.currency") }} / {{ transaction.quantity | number: '1.0-0' }} {{ + t("ipoComponent.bidStatus.pcs") }}
+
Tick: {{ transaction.targetTick | number: '1.0-0' }}
+
+
+ + arrow_downward + empty + arrow_upward + empty +
+
+
+ From: {{ transaction.sourceId }} {{ + getSeedName(transaction.sourceId) }} +
+
To: {{ transaction.destId }} {{ + getSeedName(transaction.destId) }}
+
+
+ Created: {{ transaction.created | date:'short' + }}
+ Broadcasted: {{ + transaction.broadcasted | date:'short' }}
+ Stored: {{ transaction.stored | date:'short' }}
+ Staged: {{ transaction.staged | date:'short' }}
+ Confirmed: {{ transaction.confirmed | date:'short' + }} +
+
+
+
+
+
+
+ +
+ + +
+ {{ t("ipoComponent.description") }} +
+
+
+
+
\ No newline at end of file diff --git a/src/app/ipo/ipo.component.scss b/src/app/ipo/ipo.component.scss new file mode 100644 index 0000000..c265ed1 --- /dev/null +++ b/src/app/ipo/ipo.component.scss @@ -0,0 +1,59 @@ +.mostVotes{ + font-weight: bold; +} +.proposal-card { + margin-bottom: 10px; +} +.transaction-list { + + .center { + text-align: center; + } + + display: flex; + flex-direction: row; + justify-content: flex-start; + flex-wrap: wrap; + align-items: center; + padding: 5px; + column-gap: 10px; + margin: 10px; + + .send-receive-indicator { + min-width: 98px; + text-align: right; + } + .receive { + color: green; + } + + .send { + color: red; + } + + .trans-date { + font-size: 0.9em; + } + + .trans-amount { + padding: 5px; + font-weight: bold; + min-width: 180px; + } + + .ownId { + font-weight: bold; + } + + .copy { + width: inherit; + + } + + + + + .copy span{ + word-break: break-all; + } + } \ No newline at end of file diff --git a/src/app/ipo/ipo.component.ts b/src/app/ipo/ipo.component.ts new file mode 100644 index 0000000..0b8313c --- /dev/null +++ b/src/app/ipo/ipo.component.ts @@ -0,0 +1,130 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ApiService } from '../services/api.service'; +import { WalletService } from '../services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { BalanceResponse, ContractDto, IpoBid, IpoBidOverview, ProposalDto, Transaction } from '../services/api.model'; +import { FormControl } from '@angular/forms'; +import { UpdaterService } from '../services/updater-service'; +import { Router } from '@angular/router'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-ipo', + templateUrl: './ipo.component.html', + styleUrls: ['./ipo.component.scss'] +}) +export class IpoComponent implements OnInit, OnDestroy { + + public ipoContracts: ContractDto[] = []; + public loaded: boolean = false; + public seedFilterFormControl: FormControl = new FormControl(); + public currentTick = 0; + public userServiceSubscription: Subscription | undefined; + public ipoBids: Transaction[] = []; + + + constructor(private router: Router, private transloco: TranslocoService, private api: ApiService, private walletService: WalletService, private _snackBar: MatSnackBar, private us: UpdaterService) { + + } + ngOnDestroy(): void { + if(this.userServiceSubscription) + this.userServiceSubscription.unsubscribe(); + } + + ngOnInit(): void { + this.init(); + } + + getDate() { + return new Date(); + } + + init() { + this.api.getIpoContracts().subscribe(s => { + this.ipoContracts = s; + this.loaded = true; + }); + this.loadBids(); + } + + onlyUnique(value: Transaction, index:any, array:Transaction[]) { + return array.findIndex((f: Transaction) => f.id === value.id) == index; + } + + // getTransactions(publicId: string | null = null): Transaction[] { + // return this.accountBalances.flatMap((b) => b.transactions.filter(f => publicId == null || f.sourceId == publicId || f.destId == publicId)) + // .filter(this.onlyUnique) + // .sort((a,b) => { return (new Date(b.created)) - (new Date(a.created))}); + // } + + isOwnId(publicId: string): boolean { + return this.walletService.getSeeds().find(f => f.publicId == publicId) !== undefined; + } + + getSeedName(publicId: string): string { + var seed = this.walletService.getSeeds().find(f => f.publicId == publicId); + if(seed !== undefined) + return '(' + seed.alias + ')'; + else + return ''; + } + + getSeeds() { + return this.walletService.getSeeds(); + } + + loadBids(contractId: number | null = null) { + this.api.getCurrentIpoBids(this.getSeeds().map(m => m.publicId)).subscribe(s => { + this.ipoBids = s; + }); + } + + repeat(transaction: Transaction) { + this.router.navigate(['payment'], { + state: { + template: transaction + } + }); + } + + getBids(contractId: number) { + // todo: map bids to correct contractid + return this.ipoBids; + } + + openStats() { + window.open("https://live.qubic.li/ipo", "_blank"); + } + + getTotalPrice(bids: IpoBid[]){ + return bids.reduce((p,c) => p += c.price, 0); + } + + getBidOverview(contractId: number): IpoBidOverview { + return this.ipoContracts.find(f => f.index == contractId)!.bidOverview; + } + + getMyShares(contractId: number) { + var groupedCount = this.groupBy(this.getBidOverview(contractId).bids.filter(f1 => this.getSeeds().find(f => f.publicId == f1.computorId)), p => p.computorId); + const arr = Array.from(groupedCount, ([key, value]) => ({ + computorId: key, + bids: value, + })); + return arr; + } + + groupBy(list: any[], keyGetter: (n: any) => any ) { + const map = new Map(); + list.forEach((item) => { + const key = keyGetter(item); + const collection = map.get(key); + if (!collection) { + map.set(key, [item]); + } else { + collection.push(item); + } + }); + return map; +} +} diff --git a/src/app/ipo/place-bid/place-bid.component.html b/src/app/ipo/place-bid/place-bid.component.html new file mode 100644 index 0000000..4b95b02 --- /dev/null +++ b/src/app/ipo/place-bid/place-bid.component.html @@ -0,0 +1,108 @@ + +

{{ t("ipoComponent.place-bid.title") }}

+
+ {{ t("ipoComponent.place-bid.needBalance") }} +
+
+ {{ t("ipoComponent.place-bid.noContract") }}

+ {{ t("ipoComponent.place-bid.noContract.gotoIpoLabel") }} +
+
+
+ + +
+

{{ ipoContract.name }} ({{ ipoContract.index }})

+
+
+
+ + {{ t("paymentComponent.form.sourceSeed.label") }} + + + {{seed.alias}} | {{ seed.publicId }} + + + + {{ t("paymentComponent.form.sourceSeed.error.required") }} + + +
+
+
+
+ + {{ t("ipoComponent.place-bid.form.price.placeholder") }} + + + + + {{ t("ipoComponent.place-bid.form.price.error.required") }} + + + {{ t("ipoComponent.place-bid.form.price.error.min") }} + + {{ + getTotalAmount() | number: '1.0-0' }} / {{ maxAmount | number: '1.0-0' }} {{ t("general.currency") }} + +
+
+ + {{ t("ipoComponent.place-bid.form.quantity.placeholder") }} + + + {{ t("ipoComponent.place-bid.form.quantity.error.required") }} + + + {{ t("ipoComponent.place-bid.form.quantity.error.min", {currentTick: currentTick}) }} + + +
+
+ + {{ t("paymentComponent.form.tick.placeholder") }} + + + {{ t("paymentComponent.form.tick.error.required") }} + + + {{ t("paymentComponent.form.tick.error.min", {currentTick: currentTick}) }} + + + +
+
+
+ + + +
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/src/app/ipo/place-bid/place-bid.component.scss b/src/app/ipo/place-bid/place-bid.component.scss new file mode 100644 index 0000000..cff724e --- /dev/null +++ b/src/app/ipo/place-bid/place-bid.component.scss @@ -0,0 +1,124 @@ +.flex { + display: flex; + flex-direction: row; + justify-content: center; + column-gap: 15px; + flex-wrap: wrap; + align-items: center; +} +.full-width { + width:100%; +} +.proposal { + text-align: center; +} + +.example-section { + margin: 12px 0; +} + +.example-margin { + margin: 0 12px; +} + +ul { + list-style-type: none; + margin-top: 4px; +} + +.row { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} + +.col { + flex: 1; + margin-right: 10px; + margin-left: 10px; + margin-bottom: 15px; + text-align: center; +} + +.lds-grid { + display: inline-block; + position: relative; + width: 80px; + height: 80px; +} + +.lds-grid div { + position: absolute; + width: 16px; + height: 16px; + border-radius: 50%; + background: #fff; + animation: lds-grid 1.2s linear infinite; +} + +.lds-grid div:nth-child(1) { + top: 8px; + left: 8px; + animation-delay: 0s; +} + +.lds-grid div:nth-child(2) { + top: 8px; + left: 32px; + animation-delay: -0.4s; +} + +.lds-grid div:nth-child(3) { + top: 8px; + left: 56px; + animation-delay: -0.8s; +} + +.lds-grid div:nth-child(4) { + top: 32px; + left: 8px; + animation-delay: -0.4s; +} + +.lds-grid div:nth-child(5) { + top: 32px; + left: 32px; + animation-delay: -0.8s; +} + +.lds-grid div:nth-child(6) { + top: 32px; + left: 56px; + animation-delay: -1.2s; +} + +.lds-grid div:nth-child(7) { + top: 56px; + left: 8px; + animation-delay: -0.8s; +} + +.lds-grid div:nth-child(8) { + top: 56px; + left: 32px; + animation-delay: -1.2s; +} + +.lds-grid div:nth-child(9) { + top: 56px; + left: 56px; + animation-delay: -1.6s; +} + +@keyframes lds-grid { + + 0%, + 100% { + opacity: 1; + } + + 50% { + opacity: 0.5; + } +} + diff --git a/src/app/ipo/place-bid/place-bid.component.ts b/src/app/ipo/place-bid/place-bid.component.ts new file mode 100644 index 0000000..4371d11 --- /dev/null +++ b/src/app/ipo/place-bid/place-bid.component.ts @@ -0,0 +1,193 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ApiService } from '../../services/api.service'; +import { WalletService } from '../../services/wallet.service'; +import { MatDialog } from '@angular/material/dialog'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { BalanceResponse, ContractDto, ProposalDto, Transaction } from '../../services/api.model'; +import { FormBuilder, FormControl, Validators } from '@angular/forms'; +import { UpdaterService } from '../../services/updater-service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { UnLockComponent } from 'src/app/lock/unlock/unlock.component'; + +export interface ComputorSelected { + name: string; + completed: boolean; + subComputors?: ComputorSelected[]; + published: boolean; + index?: number; + data?: string; + publishing: boolean; + publishStarted?: number; +} + +@Component({ + selector: 'app-place-bid', + templateUrl: './place-bid.component.html', + styleUrls: ['./place-bid.component.scss'] +}) +export class PlaceBidComponent implements OnInit, OnDestroy { + + public currentTick = 0; + public contractIndex: number | undefined; + private sub: any; + public balances: BalanceResponse[] = []; + public tickOverwrite = false; + public maxAmount: number = 0; + public ipoContract: ContractDto | undefined; + + public ipoForm = this.fb.group({ + sourceId: ['', [Validators.required]], + price: [10000, [Validators.required, Validators.min(1)]], + quantity: [1, [Validators.required, Validators.min(1)]], + tick: [0, [Validators.required]], + }); + + constructor(private router: Router, + private activatedRoute: ActivatedRoute, + private transloco: TranslocoService, private api: ApiService, public walletService: WalletService, private _snackBar: MatSnackBar, private us: UpdaterService + , private route: ActivatedRoute + , private fb: FormBuilder + , private dialog: MatDialog + ) { + this.activatedRoute.params.subscribe(state => { + if (state && state['contractId']) { + this.contractIndex = state['contractId']; + this.api.currentIpoContracts.subscribe(s => { + this.ipoContract = s.find(f => f.index == this.contractIndex); + }); + } + }); + } + ngOnDestroy(): void { + this.sub.unsubscribe(); + } + + ngOnInit(): void { + this.init(); + } + init(): void { + this.sub = this.us.currentBalance.subscribe(s => { + this.balances = s; + }); + this.us.currentTick.subscribe(tick => { + this.currentTick = tick; + this.ipoForm.controls.tick.addValidators(Validators.min(tick)); + if (!this.tickOverwrite) { + this.ipoForm.controls.tick.setValue(tick + 10); + } + }) + this.ipoForm.controls.sourceId.valueChanges.subscribe(s => { + if (s) { + // try to get max amount + this.getMaxAmount(s); + } + }); + } + + + hasSeeds() { + return this.walletService.getSeeds().length > 0; + } + + onlyUnique(value: Transaction, index: any, array: Transaction[]) { + return array.findIndex((f: Transaction) => f.id === value.id) == index; + } + + isOwnId(publicId: string): boolean { + return this.walletService.getSeeds().find(f => f.publicId == publicId) !== undefined; + } + + getSeedName(publicId: string): string { + var seed = this.walletService.getSeeds().find(f => f.publicId == publicId); + if (seed !== undefined) + return '(' + seed.alias + ')'; + else + return ''; + } + + getSeeds() { + return this.walletService.getSeeds(); + } + repeat(transaction: Transaction) { + this.router.navigate(['payment'], { + state: { + template: transaction + } + }); + } + + + setComputor(comp: ComputorSelected, ev: any) { + comp.completed = ev; + } + + loadKey() { + const dialogRef = this.dialog.open(UnLockComponent, { restoreFocus: false }); + } + getMaxAmount(publicId: string) { + this.us.currentBalance.subscribe(s => { + if (s && s.length > 0 && s.find(f => f.publicId == publicId)) { + this.maxAmount = s.find(f => f.publicId == publicId)?.currentEstimatedAmount ?? s.find(f => f.publicId == publicId)?.epochBaseAmount ?? 0; + } else { + this.maxAmount = 0; + } + }); + } + + setAmounToMax(addAmount: number = 0) { + this.ipoForm.controls.price.setValue(this.maxAmount + addAmount); + } + + onSubmit(): void { + if (!this.walletService.privateKey) { + this._snackBar.open(this.transloco.translate('ipoComponent.messages.unlock'), this.transloco.translate('general.close'), { + duration: 5000, + panelClass: "error" + }); + } + + // todo: create service: same is used in payment component. + + if (this.ipoForm.valid && this.ipoContract) { + this.walletService.revealSeed((this.ipoForm.controls.sourceId.value)).then(s => { + new QubicHelper().createIpo(s, this.ipoContract?.index!, this.ipoForm.controls.price.value!, this.ipoForm.controls.quantity.value!, this.ipoForm.controls.tick.value!).then(tx => { + // hack to get uintarray to array for sending to api + this.api.submitTransaction({ SignedTransaction: this.walletService.arrayBufferToBase64(tx) }).subscribe(r => { + if (r && r.id) { + this._snackBar.open(this.transloco.translate('ipoComponent.messages.unlock', { id: r.id}), this.transloco.translate('general.close'), { + duration: 3000, + }); + // this.init(); + this.router.navigate(['/ipo']); + } + }, er => { + this._snackBar.open(this.transloco.translate('ipoComponent.messages.failedToSend'), this.transloco.translate('general.close'), { + duration: 5000, + panelClass: "error" + }); + }); + }); + }).catch(e => { + this._snackBar.open(this.transloco.translate('ipoComponent.messages.failedToDecrypt'), this.transloco.translate('general.close'), { + duration: 10000, + panelClass: "error" + }); + }); + } else { + this._snackBar.open(this.transloco.translate('ipoComponent.messages.failedToValidate'), this.transloco.translate('general.close'), { + duration: 5000, + panelClass: "error" + }); + } + } + + getTotalAmount(): number { + if(this.ipoForm.controls['price'].value && this.ipoForm.controls['quantity'].value && this.ipoForm.controls['quantity'].value > 0 && this.ipoForm.controls['price'].value > 0) + return this.ipoForm.controls['price'].value * this.ipoForm.controls['quantity'].value; + else + return 0; + } +} diff --git a/src/app/lock/config-error/config-error.component.html b/src/app/lock/config-error/config-error.component.html new file mode 100644 index 0000000..d8c98ad --- /dev/null +++ b/src/app/lock/config-error/config-error.component.html @@ -0,0 +1,13 @@ + +

Configuration Error

+ + It looks like we were not able to load the configurtion. In this state we cannot start.

+ + You can reset the configuration and start with a new wallet. We recommend you to store the above text and contact us + for help. +

+
+ + + +
\ No newline at end of file diff --git a/src/app/lock/config-error/config-error.component.scss b/src/app/lock/config-error/config-error.component.scss new file mode 100644 index 0000000..c93b17e --- /dev/null +++ b/src/app/lock/config-error/config-error.component.scss @@ -0,0 +1,4 @@ +.config { + width:100%; + min-height:300px; +} diff --git a/src/app/lock/config-error/config-error.component.ts b/src/app/lock/config-error/config-error.component.ts new file mode 100644 index 0000000..65a39f6 --- /dev/null +++ b/src/app/lock/config-error/config-error.component.ts @@ -0,0 +1,33 @@ +import { DialogRef } from '@angular/cdk/dialog'; +import { Component, Injector, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import {MatSnackBar} from '@angular/material/snack-bar'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; + + +@Component({ + selector: 'qli-config-error', + templateUrl: './config-error.component.html', + styleUrls: ['./config-error.component.scss'] +}) +export class ConfigErrorComponent extends QubicDialogWrapper { + + public file: File | null = null; + + + + dialogRef: DialogRef | null = null; + + constructor(renderer: Renderer2, themeService: ThemeService, public walletService: WalletService, private fb: FormBuilder, private _snackBar: MatSnackBar, private injector: Injector) { + super(renderer, themeService); + } + + + resetConfig(): void { + this.walletService.resetConfig(); + } + + +} diff --git a/src/app/lock/confirm-lock/confirm-lock.component.html b/src/app/lock/confirm-lock/confirm-lock.component.html new file mode 100644 index 0000000..dcc4d58 --- /dev/null +++ b/src/app/lock/confirm-lock/confirm-lock.component.html @@ -0,0 +1,42 @@ + +
+
+

+ {{ t("lockComponent.forceDownload.title")}} + {{ t("lockComponent.title")}} +

+ + + {{ t("lockComponent.forceDownload.reason")}} + + + {{ t("lockComponent.reason")}} +

+ {{ t("unlockComponent.welcomeHintMessage") }} +

+
+
+ + + + + + {{ t("lockComponent.password.required")}} + + + {{ t("lockComponent.password.min")}} + +
+
+ +
+ + + + + +
+
+
+
+
\ No newline at end of file diff --git a/src/app/lock/confirm-lock/confirm-lock.component.scss b/src/app/lock/confirm-lock/confirm-lock.component.scss new file mode 100644 index 0000000..87f51c6 --- /dev/null +++ b/src/app/lock/confirm-lock/confirm-lock.component.scss @@ -0,0 +1,15 @@ +form { + display: flex; + justify-content: space-evenly; + align-items: center; + flex-direction: column; + flex-wrap: wrap; + row-gap: 15px; +} +.file-input { + display: none; +} +.password-container { + margin-top: 16px; + margin-bottom:16px; +} \ No newline at end of file diff --git a/src/app/lock/confirm-lock/confirm-lock.component.ts b/src/app/lock/confirm-lock/confirm-lock.component.ts new file mode 100644 index 0000000..7c12f5d --- /dev/null +++ b/src/app/lock/confirm-lock/confirm-lock.component.ts @@ -0,0 +1,97 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { ChangeDetectorRef, Component, Inject, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatDialog } from '@angular/material/dialog'; +import { TranslocoService } from '@ngneat/transloco'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; +import { ThemeService } from 'src/app/services/theme.service'; +import { WalletService } from 'src/app/services/wallet.service'; +import { OkDialog } from 'src/app/core/ok-dialog/ok-dialog.component'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'qli-lock-confirm', + templateUrl: './confirm-lock.component.html', + styleUrls: ['./confirm-lock.component.scss'] +}) +export class LockConfirmDialog extends QubicDialogWrapper { + + public showSave: boolean = false; + + exportForm = this.fb.group({ + password: [null, [Validators.required, Validators.minLength(8)]], + }); + + public keyDownload = false; + public isVaultFileExported = false; // is set to true as soon the vault file has been exported/downloaded + + constructor(renderer: Renderer2, private _snackBar: MatSnackBar, private router: Router, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, private chdet: ChangeDetectorRef, public walletService: WalletService, private dialog: MatDialog, private fb: FormBuilder, private dialogRef: DialogRef, private transloco: TranslocoService) { + super(renderer, themeService); + if (data && data.command && data.command == "keyDownload") { + this.keyDownload = true; + } + } + + toggleShowSave() { + if (this.showSave) { + this.showSave = false; + } else { + this.showSave = true; + } + this.chdet.detectChanges(); + } + + async exportVault(showConfirmation = true, closeDialog = true): Promise { + if (this.exportForm.valid && this.exportForm.controls.password.value) { + + try{ + await this.walletService.exportVault(this.exportForm.controls.password.value) + + + this.isVaultFileExported = true; + + if(closeDialog) + this.dialogRef.close(); + + if(showConfirmation && !this.showSave){ + const dialogRef = this.dialog.open(OkDialog, { + data: { + title: this.transloco.translate("okDialog.title"), + message: this.transloco.translate("okDialog.messages.tresorText"), + button: this.transloco.translate("okDialog.button") + }, + }); + } + return true; + } catch(e) { + console.error(e); + this._snackBar.open("Export failed", "close", { + duration: 5000, + panelClass: "error" + }); + }; + + + } + + return false; + } + + onSubmit(): void { + this.exportVault(); + } + + async closeWallet() { + this.walletService.isWalletReady = false; + await this.walletService.lock(); + this.dialogRef.close(); + this.router.navigate(['/unlock']); + } + + async saveAndCloseWallet() { + if(await this.exportVault(false, false)) + this.closeWallet(); + } +} diff --git a/src/app/lock/export-config/export-config.component.html b/src/app/lock/export-config/export-config.component.html new file mode 100644 index 0000000..bb32535 --- /dev/null +++ b/src/app/lock/export-config/export-config.component.html @@ -0,0 +1,68 @@ + +

+ {{ t("exportConfigComponent.title") }} +

+ + +
+
+
+ {{ t("exportConfigComponent.messages.export") }} +
+
+
+ {{ t("exportConfigComponent.messages.info") }} +
+
+ + + + + {{ t("lockComponent.password.required") }} + + + {{ t("lockComponent.password.min") }} + +
+
+
+
+ {{ t("exportConfigComponent.messages.unlockInfo") }} +
+
+
+
+
+ +
+ + +
+
+
diff --git a/src/app/lock/export-config/export-config.component.scss b/src/app/lock/export-config/export-config.component.scss new file mode 100644 index 0000000..d278815 --- /dev/null +++ b/src/app/lock/export-config/export-config.component.scss @@ -0,0 +1,41 @@ +.important { + display: flex; + align-items: center; + column-gap: 10px; +} +form { + display: flex; + justify-content: space-evenly; + align-items: center; + column-gap: 15px; +} +mat-dialog-content { + max-width: 700px; + display: flex; + flex-direction: column; + align-items: center; +} + + + +.imexport { + max-width: 350px; + display: flex; + flex-direction: column; + column-gap: 10px; + row-gap: 20px; + justify-content: center; + align-items: center; + ngx-file-drop { + width: 95%; + } + .import-done { + mat-icon { + font-size: 30px; + } + } + .export { + text-align: center; + row-gap: 10px;; + } +} \ No newline at end of file diff --git a/src/app/lock/export-config/export-config.component.ts b/src/app/lock/export-config/export-config.component.ts new file mode 100644 index 0000000..57219c8 --- /dev/null +++ b/src/app/lock/export-config/export-config.component.ts @@ -0,0 +1,51 @@ +import { DialogRef } from '@angular/cdk/dialog'; +import { ChangeDetectorRef, Component, Inject, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators, } from '@angular/forms'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { TranslocoService } from '@ngneat/transloco'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; +import { ThemeService } from 'src/app/services/theme.service'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatDialog } from '@angular/material/dialog'; +import { UnLockComponent } from '../unlock/unlock.component'; + +@Component({ + selector: 'qli-export-config', + templateUrl: './export-config.component.html', + styleUrls: ['./export-config.component.scss'] +}) +export class ExportConfigDialog extends QubicDialogWrapper{ + + public isMobile = true; + + exportForm = this.fb.group({ + password: [null, [Validators.required, Validators.minLength(8)]], + }); + + constructor(renderer: Renderer2, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, private chdet: ChangeDetectorRef, public walletService: WalletService, public dialog: MatDialog, private fb: FormBuilder, private dialogRef: DialogRef, private transloco: TranslocoService, private _snackBar: MatSnackBar) { + super(renderer, themeService); + } + + public export() { + if (this.exportForm.valid && this.exportForm.controls.password.value) { + if(!this.walletService.exportVault(this.exportForm.controls.password.value)){ + this._snackBar.open(this.transloco.translate("settings.export.noData"), this.transloco.translate("general.close") , { + duration: 0, + panelClass: "error" + }); + } + } + } + + close() { + this.dialogRef.close(); + } + + loadKey() { + this.dialog.open(UnLockComponent).afterClosed().subscribe(s => { + this.dialog.open(ExportConfigDialog); + }); + } + +} diff --git a/src/app/lock/load-config/load-config.component.html b/src/app/lock/load-config/load-config.component.html new file mode 100644 index 0000000..b704fd2 --- /dev/null +++ b/src/app/lock/load-config/load-config.component.html @@ -0,0 +1,35 @@ + +

+ {{ t("loadConfigComponent.title")}} +

+ +
+ {{ t("loadConfigComponent.messages.import") }} +
+ + +

+
+ {{ t("settings.import.seedsMessage", { amount: configToImport.seeds.length}) }} +
+
+ {{ t("loadConfigComponent.messages.noImport") }} +
+
+ {{ fileError }} +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
\ No newline at end of file diff --git a/src/app/lock/load-config/load-config.component.scss b/src/app/lock/load-config/load-config.component.scss new file mode 100644 index 0000000..b9846a4 --- /dev/null +++ b/src/app/lock/load-config/load-config.component.scss @@ -0,0 +1,17 @@ +.important { + display: flex; + align-items: center; + column-gap: 10px; +} +form { + display: flex; + justify-content: space-evenly; + align-items: center; + column-gap: 15px; +} +mat-dialog-content { + max-width: 700px; + display: flex; + flex-direction: column; + align-items: center; +} \ No newline at end of file diff --git a/src/app/lock/load-config/load-config.component.ts b/src/app/lock/load-config/load-config.component.ts new file mode 100644 index 0000000..eb9f619 --- /dev/null +++ b/src/app/lock/load-config/load-config.component.ts @@ -0,0 +1,100 @@ +import { DialogRef } from '@angular/cdk/dialog'; +import { ChangeDetectorRef, Component, Inject, Renderer2 } from '@angular/core'; +import { FormBuilder, } from '@angular/forms'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { TranslocoService } from '@ngneat/transloco'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; +import { ThemeService } from 'src/app/services/theme.service'; +import { WalletService } from 'src/app/services/wallet.service'; +import { IConfig } from '../../model/config'; +import { NgxFileDropEntry } from 'ngx-file-drop'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialog } from 'src/app/core/confirm-dialog/confirm-dialog.component'; + +@Component({ + selector: 'qli-load-config', + templateUrl: './load-config.component.html', + styleUrls: ['./load-config.component.scss'] +}) +export class LoadConfigDialog extends QubicDialogWrapper{ + + public fileError: string = ""; + public configToImport: IConfig | undefined; + public isMobile = true; + public importDone = false; + + + constructor(renderer: Renderer2, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, private chdet: ChangeDetectorRef, public walletService: WalletService, public dialog: MatDialog, private fb: FormBuilder, private dialogRef: DialogRef, private transloco: TranslocoService, private _snackBar: MatSnackBar) { + super(renderer, themeService); + + + } + + public import() { + if(!this.configToImport) + return; + const confirmDialog = this.dialog.open(ConfirmDialog, { restoreFocus: false }); + confirmDialog.afterClosed().subscribe(result => { + if (result) { + if(!this.walletService.importConfig(this.configToImport!)){ + this._snackBar.open(this.transloco.translate("settings.import.failed"), this.transloco.translate("general.close") , { + duration: 0, + panelClass: "error" + }); + }else { + this.importDone = true; + window.location.reload(); + } + } + }) + } + + public dropped(files: NgxFileDropEntry[]) { + if(files.length !== 1){ + this._snackBar.open(this.transloco.translate("settings.export.onlyOneFile"), this.transloco.translate("general.close") , { + duration: 0, + panelClass: "error" + }); + return; + } + //this.file = files[0]; + for (const droppedFile of files) { + + // Is it a file? + if (droppedFile.fileEntry.isFile) { + const fileEntry = droppedFile.fileEntry as FileSystemFileEntry; + fileEntry.file((file: File) => { + + // analyze file + file.arrayBuffer().then(b => { + const enc = new TextDecoder("utf-8"); + const jsonData = enc.decode(b); + if(jsonData){ + this.configToImport = JSON.parse(jsonData); + //todo: better type check + if(!this.configToImport || !this.configToImport.seeds){ + this.configToImport = undefined; + this._snackBar.open(this.transloco.translate("settings.import.invalidConfig"), this.transloco.translate("general.close"), { + duration: 5000, + panelClass: "error" + }); + } + } + }).catch(r => { + this._snackBar.open(this.transloco.translate("settings.import.wrongFile"), this.transloco.translate("general.close"), { + duration: 5000, + panelClass: "error" + }); + }); + + }); + } + } + } + + close() { + this.dialogRef.close(); + } + +} diff --git a/src/app/lock/lock.component.html b/src/app/lock/lock.component.html new file mode 100644 index 0000000..32ddc53 --- /dev/null +++ b/src/app/lock/lock.component.html @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/src/app/lock/lock.component.scss b/src/app/lock/lock.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/lock/lock.component.ts b/src/app/lock/lock.component.ts new file mode 100644 index 0000000..b53e7ee --- /dev/null +++ b/src/app/lock/lock.component.ts @@ -0,0 +1,43 @@ +import { Component } from '@angular/core'; +import { WalletService } from '../services/wallet.service'; +import { MatDialog } from '@angular/material/dialog'; +import { LockConfirmDialog } from './confirm-lock/confirm-lock.component'; +import { UnLockComponent } from './unlock/unlock.component'; + + +@Component({ + selector: 'qli-lock', + templateUrl: './lock.component.html', + styleUrls: ['./lock.component.scss'] +}) +export class LockComponent { + constructor(public walletService: WalletService, public dialog: MatDialog) { + + } + + public getName() { + if(this.walletService.getName()){ + return ' ' + this.walletService.getName(); + } + return ''; + } + + lock(): void { + const dialogRef = this.dialog.open(LockConfirmDialog, { restoreFocus: false }); + + // Manually restore focus to the menu trigger since the element that + // opens the dialog won't be in the DOM any more when the dialog closes. + dialogRef.afterClosed().subscribe(() => { + // do anything :) + }); + } + unlock(): void { + const dialogRef = this.dialog.open(UnLockComponent, { restoreFocus: false }); + + // Manually restore focus to the menu trigger since the element that + // opens the dialog won't be in the DOM any more when the dialog closes. + dialogRef.afterClosed().subscribe(() => { + // do anything :) + }); + } +} diff --git a/src/app/lock/unlock/unlock.component.html b/src/app/lock/unlock/unlock.component.html new file mode 100644 index 0000000..b48ec70 --- /dev/null +++ b/src/app/lock/unlock/unlock.component.html @@ -0,0 +1,102 @@ + +
+ + +
+
+

+ {{ t("unlockComponent.title") }} +

+

+ {{ t("unlockComponent.title.new") }} +

+ +
+ {{ t("unlockComponent.welcomeMessage") }} +

+
+
+ {{ t("unlockComponent.reasonMessage") }} +

+
+
+
+ + + + + + + {{ t("unlockComponent.form.password.error.required") }} + + + {{ t("unlockComponent.form.password.error.min") }} + + + {{ t("unlockComponent.form.password.error.wrong") }} + + +
+ +
+
+
+
+
+
+ +
+ + + +
+
+
+
diff --git a/src/app/lock/unlock/unlock.component.scss b/src/app/lock/unlock/unlock.component.scss new file mode 100644 index 0000000..f829a7b --- /dev/null +++ b/src/app/lock/unlock/unlock.component.scss @@ -0,0 +1,11 @@ +form { + display: flex; + justify-content: space-evenly; + align-items: center; + flex-direction: column; + flex-wrap: wrap; + row-gap: 15px; +} +.file-input { + display: none; +} \ No newline at end of file diff --git a/src/app/lock/unlock/unlock.component.ts b/src/app/lock/unlock/unlock.component.ts new file mode 100644 index 0000000..109703b --- /dev/null +++ b/src/app/lock/unlock/unlock.component.ts @@ -0,0 +1,279 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { ChangeDetectorRef, Component, Injector, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { LockConfirmDialog } from '../confirm-lock/confirm-lock.component'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialog } from 'src/app/core/confirm-dialog/confirm-dialog.component'; +import { TranslocoService } from '@ngneat/transloco'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; +import { UpdaterService } from 'src/app/services/updater-service'; + + +@Component({ + selector: 'qli-unlock', + templateUrl: './unlock.component.html', + styleUrls: ['./unlock.component.scss'] +}) +export class UnLockComponent extends QubicDialogWrapper { + + public file: File | null = null; + public configFile: File | null = null; + public newUser = false; + public pwdWrong = false; + public selectedFileIsVaultFile = false; + + importForm = this.fb.group({ + password: [null, [Validators.required, Validators.minLength(8)]], + }); + + dialogRef: DialogRef | null = null; + + constructor( + renderer: Renderer2, + themeService: ThemeService, + public walletService: WalletService, + public updaterService: UpdaterService, + private transloco: TranslocoService, + private cdr: ChangeDetectorRef, + private fb: FormBuilder, + private dialog: MatDialog, + private _snackBar: MatSnackBar, + private injector: Injector) { + super(renderer, themeService); + this.dialogRef = injector.get(DialogRef, null) + this.newUser = this.walletService.getSeeds().length <= 0 && !this.walletService.publicKey; + } + + onPasswordChange() { + this.pwdWrong = false; + } + + + isNewUser() { + return this.newUser; + } + toggleNewUser(v: boolean) { + this.newUser = v; + this.cdr.detectChanges(); + } + + async startCreateProcess() { + this.walletService.clearConfig(); + await this.walletService.createNewKeys(); + this.toggleNewUser(false); + const lockRef = this.dialog.open(LockConfirmDialog, { + restoreFocus: false, closeOnNavigation: false, disableClose: true, data: { + command: "keyDownload" + } + }); + + // Manually restore focus to the menu trigger since the element that + // opens the dialog won't be in the DOM any more when the dialog closes. + lockRef.afterClosed().subscribe(() => { + // do anything :) + this.dialogRef?.close(); + }); + } + + gengerateNew() { + if (this.hasExistingConfig()) { + const confirmDialo = this.dialog.open(ConfirmDialog, { + restoreFocus: false, data: { + message: this.transloco.translate("unlockComponent.overwriteVault") + } + }); + confirmDialo.afterClosed().subscribe(result => { + if (result) { + this.startCreateProcess(); + } + }) + } else { + this.startCreateProcess(); + } + } + + lock() { + + this.dialogRef?.close(); + + const dialogRef = this.dialog.open(LockConfirmDialog, { restoreFocus: false }); + + // Manually restore focus to the menu trigger since the element that + // opens the dialog won't be in the DOM any more when the dialog closes. + dialogRef.afterClosed().subscribe(() => { + + }); + } + + private async importAndUnlock() { + if (this.selectedFileIsVaultFile) { + // one vault file + const binaryFileData = await this.file?.arrayBuffer(); + if (binaryFileData) { + const success = await this.walletService.importVault(binaryFileData, (this.importForm.controls.password.value)); + if (success) { + this.pwdWrong = false; + this.walletService.isWalletReady = true; + this.updaterService.loadCurrentBalance(true); + this.dialogRef?.close(); + } else { + this._snackBar.open("Import Failed (passord or file do not match)", "close", { + duration: 5000, + panelClass: "error" + }); + } + } else { + this._snackBar.open("Unlock Failed (no file)", "close", { + duration: 5000, + panelClass: "error" + }); + } + } else { + const binaryFileData = await this.configFile?.arrayBuffer(); + if (binaryFileData) { + const enc = new TextDecoder("utf-8"); + const jsonData = enc.decode(binaryFileData); + if (jsonData) { + const config = JSON.parse(jsonData); + + // import configuration + if((await this.unlock())){ + // legacy format + await this.walletService.importConfig(config); + this.updaterService.loadCurrentBalance(true); + } + } else { + this._snackBar.open("Unlock Failed (no file)", "close", { + duration: 5000, + panelClass: "error" + }); + } + } + } + } + + public hasExistingConfig() { + return this.walletService.getSeeds().length > 0 || this.walletService.publicKey; + } + + async checkImportAndUnlock() { + if (this.hasExistingConfig()) { + const confirmDialo = this.dialog.open(ConfirmDialog, { + restoreFocus: false, data: { + message: this.transloco.translate("unlockComponent.overwriteVault") + } + }); + confirmDialo.afterClosed().subscribe(result => { + if (result) { + // start import + this.importAndUnlock(); + } + }) + } else { + this.importAndUnlock(); + } + } + + public async unlock(): Promise { + + if (!this.importForm.valid || !this.importForm.controls.password.value || !this.file) { + this.importForm.markAsTouched(); + this.importForm.controls.password.markAllAsTouched(); + return false; + } + + let unlockPromise: Promise | undefined; + + const binaryFileData = await this.file?.arrayBuffer(); + + if (this.selectedFileIsVaultFile) { + if (binaryFileData) { + unlockPromise = this.walletService.unlockVault(binaryFileData, (this.importForm.controls.password.value)); + } else { + this._snackBar.open("Unlock Failed (no file)", "close", { + duration: 5000, + panelClass: "error" + }); + } + } else { + // legacy + this.pwdWrong = true; + unlockPromise = this.walletService.unlock(binaryFileData, (this.importForm.controls.password.value)); + + } + + if (unlockPromise) { + await unlockPromise.then(async r => { + if (r) { + + // test if the private and public key match + const seeds = this.walletService.getSeeds(); + let decryptedSeed = ''; + try { + decryptedSeed = await this.walletService.revealSeed( + seeds[0].publicId + ); + } catch (e) { + console.error(e); + } + + if (seeds && seeds.length > 0 && decryptedSeed == '') { + this._snackBar.open( + 'Unlock Failed: Private- and PublicKey mismatch', + 'close', + { + duration: 5000, + panelClass: 'error', + } + ); + this.walletService.lock(); + } else { + this.pwdWrong = false; + this.walletService.isWalletReady = true; + this.updaterService.loadCurrentBalance(true); + this.dialogRef?.close(); + } + + + } else { + this._snackBar.open("Import Failed", "close", { + duration: 5000, + panelClass: "error" + }); + } + }).catch(r => { + this._snackBar.open("Import Failed (passord or file do not match)", "close", { + duration: 5000, + panelClass: "error" + }); + }); + return true; + } + + return false; + } + + onSubmit(event: any): void { + event.stopPropagation(); + event.preventDefault(); + this.unlock(); + } + + + async onFileSelected(file: File): Promise { + this.file = file; + if (this.file) { + const binaryVaultFile = await this.file.arrayBuffer(); + this.selectedFileIsVaultFile = this.walletService.isVaultFile(binaryVaultFile); + } + } + + async onConfigFileSelected(file: File): Promise { + this.configFile = file; + } + + +} diff --git a/src/app/main/assets/assets.component.html b/src/app/main/assets/assets.component.html new file mode 100644 index 0000000..92e8caf --- /dev/null +++ b/src/app/main/assets/assets.component.html @@ -0,0 +1,16 @@ + +

{{t("assetsComponent.title", {name: seed.alias})}}

+ + +
+ {{asset.ownedAmount}}({{asset.possessedAmount}}) {{ asset.assetName }}
+
+
+ {{t("assetsComponent.openAssets")}} + + +
+ + + +
\ No newline at end of file diff --git a/src/app/main/assets/assets.component.scss b/src/app/main/assets/assets.component.scss new file mode 100644 index 0000000..ee750cc --- /dev/null +++ b/src/app/main/assets/assets.component.scss @@ -0,0 +1,11 @@ +.seedInput { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + row-gap: 10px; + mat-form-field { + width:100%; +} + +} diff --git a/src/app/main/assets/assets.component.ts b/src/app/main/assets/assets.component.ts new file mode 100644 index 0000000..8601dc1 --- /dev/null +++ b/src/app/main/assets/assets.component.ts @@ -0,0 +1,28 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { ChangeDetectorRef, Component, Inject, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { IDecodedSeed, ISeed } from 'src/app/model/seed'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { UnLockComponent } from 'src/app/lock/unlock/unlock.component'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; + + +@Component({ + selector: 'qli-assets', + templateUrl: './assets.component.html', + styleUrls: ['./assets.component.scss'] +}) +export class AssetsDialog extends QubicDialogWrapper { + public s = ''; + public seed: ISeed; + constructor(renderer: Renderer2, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, chgd: ChangeDetectorRef, private walletService: WalletService, dialog: Dialog, private fb: FormBuilder, private dialogRef: DialogRef, private _snackBar: MatSnackBar) { + super(renderer, themeService); + this.seed = this.walletService.getSeed(data.publicId)!; + } + + +} diff --git a/src/app/main/edit-seed/seed-edit.component.html b/src/app/main/edit-seed/seed-edit.component.html new file mode 100644 index 0000000..17aecec --- /dev/null +++ b/src/app/main/edit-seed/seed-edit.component.html @@ -0,0 +1,86 @@ +
+

{{ t("seedEditComponent.title.add") }}{{ t("seedEditComponent.title.edit") }}

+ +
+
+ + {{ t("seedEditComponent.form.alias.placeholder") }} + + + {{ t("seedEditComponent.form.alias.error.required")}} + + + {{ t("seedEditComponent.form.alias.error.min")}} + + + {{ t("seedEditComponent.form.alias.error.max")}} + + + {{ t("seedEditComponent.form.alias.error.regex", {regex: "a-zA-Z0-9_-"})}} + + +
{{ t('seedEditComponent.form.watchOnlyAddress.title')}}
+
+
+ + {{ t("seedEditComponent.form.watchOnlyAddress.placeholder") }} + + + {{ t("seedEditComponent.form.watchOnlyAddress.error.required")}} + + + {{ t("seedEditComponent.form.watchOnlyAddress.error.min")}} + + + {{ t("seedEditComponent.form.watchOnlyAddress.error.max")}} + + + {{ t("seedEditComponent.form.watchOnlyAddress.error.regex", {regex: "a-zA-Z0-9_-"})}} + + +
+ +
+
+
+
+ + {{ t("seedEditComponent.form.seed.placeholder") }} + + + {{ t("seedEditComponent.form.seed.error.required")}} + + + {{ t("seedEditComponent.form.seed.error.min")}} + + + {{ t("seedEditComponent.form.seed.error.max")}} + + + {{ t("seedEditComponent.form.seed.error.regex", {regex: "a-zA-Z0-9_-"})}} + + + +
+
+ {{ t("seedEditComponent.publicIdMessage")}}
+
{{getPublicId()}}
+
+
+ {{ t("seedEditComponent.privateKeyWarning")}} +
+
+
+
+
+ +
+ + + + +
+
+
\ No newline at end of file diff --git a/src/app/main/edit-seed/seed-edit.component.scss b/src/app/main/edit-seed/seed-edit.component.scss new file mode 100644 index 0000000..4205168 --- /dev/null +++ b/src/app/main/edit-seed/seed-edit.component.scss @@ -0,0 +1,47 @@ +form { + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; + row-gap: 10px; + mat-form-field { + width:100%; + } + .seedInput { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width:100%; + } + +} + +.puglicIdView { + display: flex; + flex-direction: column; + row-gap: 5px;; + align-items: center; + width: 100%; + .keywarning{ + margin-top: 10px; + display: flex; + align-items: center; + } +} + +.danger { + display:flex; + justify-content: center; +} +.dialog-container { + min-width: 350px; +} +.load-key-container { + width:100%; + display: flex; + justify-content: center; + button { + min-width: 90%; + } +} \ No newline at end of file diff --git a/src/app/main/edit-seed/seed-edit.component.ts b/src/app/main/edit-seed/seed-edit.component.ts new file mode 100644 index 0000000..54cb5bf --- /dev/null +++ b/src/app/main/edit-seed/seed-edit.component.ts @@ -0,0 +1,143 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { Component, Inject, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { IDecodedSeed, ISeed } from 'src/app/model/seed'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { UnLockComponent } from 'src/app/lock/unlock/unlock.component'; +import { TranslocoService } from '@ngneat/transloco'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; + + +@Component({ + selector: 'qli-seed-edit', + templateUrl: './seed-edit.component.html', + styleUrls: ['./seed-edit.component.scss'] +}) +export class SeedEditDialog extends QubicDialogWrapper { + + seedEditForm = this.fb.group({ + alias: ["Seed " + (this.walletService.getSeeds().length + 1), [Validators.required, Validators.minLength(3), Validators.maxLength(50)]], + seed: ['', [Validators.required, Validators.minLength(55), Validators.maxLength(55), Validators.pattern('[a-z]*')]], + publicId: ['', [Validators.required, Validators.minLength(60), Validators.maxLength(60), Validators.pattern('[A-Z]*')]], + isWatchOnlyAddress: [false], + }); + + isNew = true; + seed: IDecodedSeed = ({}); + + constructor(renderer: Renderer2, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, public walletService: WalletService, private dialog: Dialog, private fb: FormBuilder, private dialogRef: DialogRef, private _snackBar: MatSnackBar, private transloco: TranslocoService) { + super(renderer, themeService); + + if (data.publicId) { + this.seed = (this.walletService.getSeed(data.publicId)); + this.isNew = false; + } + + this.seedEditForm.controls.seed.valueChanges.subscribe(v => { + this.generateIds(v!); + }); + + this.init(); + } + + init() { + if (this.isNew) { + this.seedEditForm.controls.alias.setValue(this.transloco.translate("seedEditComponent.newSeedName") + " " + (this.walletService.getSeeds().length + 1)); + } else { + this.seedEditForm.controls.alias.setValue(this.seed.alias); + this.seedEditForm.controls.publicId.setValue(this.seed.publicId); + this.seedEditForm.controls.publicId.clearValidators(); + this.seedEditForm.controls.seed.clearValidators(); + } + } + + getPublicId(): string { + return this.seedEditForm.controls.alias.valid && this.seedEditForm.controls.publicId.value ? this.seed?.publicId : ''; + } + + onSubmit(): void { + if (this.seedEditForm.controls.isWatchOnlyAddress.value) { + this.saveOnlyPublicKey(); + } else { + this.saveSeed(); + } + } + + async saveSeed() { + if (this.seedEditForm.valid) { + if (!this.isNew) { + this.walletService.updateSeedAlias(this.seed.publicId, this.seedEditForm.controls.alias.value!) + } else { + this.seed.alias = this.seedEditForm.controls.alias.value!; + this.generateIds(this.seedEditForm.controls.seed.value!); + await this.walletService.addSeed(this.seed); + } + this.dialogRef.close(); + } else { + this._snackBar.open(this.transloco.translate("seedEditComponent.form.error.text"), this.transloco.translate("seedEditComponent.form.error.close"), { + duration: 5000, + panelClass: "error" + }); + } + } + + async saveOnlyPublicKey() { + if (this.seedEditForm.controls.alias.valid && this.seedEditForm.controls.publicId.valid) { + if (!this.isNew) { + this.walletService.updateSeedAlias(this.seed.publicId, this.seedEditForm.controls.alias.value!) + } else { + this.seed.alias = this.seedEditForm.controls.alias.value!; + this.seed.publicId = this.seedEditForm.controls.publicId.value!; + await this.walletService.addSeed(this.seed); + } + this.dialogRef.close(); + } else { + this._snackBar.open(this.transloco.translate("seedEditComponent.form.error.text"), this.transloco.translate("seedEditComponent.form.error.close"), { + duration: 5000, + panelClass: "error" + }); + } + } + + + generateIds(seed: string): void { + new QubicHelper().createIdPackage(seed).then((response: { publicKey: Uint8Array, publicId: string }) => { + this.seedEditForm.controls.publicId.setValue(response.publicId); + this.seed.publicId = response.publicId; + //this.seed.publicKey = response.publicKey; + this.seed.seed = seed; + }); + } + + generateSeed(): void { + const seed = this.seedGen(); + this.seedEditForm.controls.seed.setValue(seed); + //this.generateIds(seed); + } + + seedGen(): string { + const letters = "abcdefghijklmnopqrstuvwxyz"; + const letterSize = letters.length; + let seed = ""; + for (let i = 0; i < 55; i++) { + seed += letters[Math.floor(Math.random() * letterSize)]; + } + return seed; + } + + copyPublicId() { + navigator.clipboard.writeText(this.seedEditForm.controls.publicId.value!); + } + + loadKey() { + this.dialogRef.close(); + window.setTimeout(() => { + this.dialog.open(UnLockComponent); + }, 500); + } + +} diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html new file mode 100644 index 0000000..f24e185 --- /dev/null +++ b/src/app/main/main.component.html @@ -0,0 +1,223 @@ + +
+
+
+

{{ t("seedOverviewComponent.title") }}

+

{{ t("dashboard.title") }}

+
+
+
+ {{currentPrice.price * 1000000000}} {{currentPrice.currency}} / b{{ t("general.currency") }} +
+ ~ {{currentPrice.capitalization| number : "1.0-0"}} {{currentPrice.currency}} MC +
+ +
+
+ + {{ t("seedOverviewComponent.search.label") }} + + +
+
+   + {{ + t('seedOverviewComponent.isTable')}} + + +
+
+
+ {{ t("dashboard.totalBalance") }} +
+ + {{ getTotalBalance() | number : "1.0-0"}} {{ t("general.currency") }} + / + + ${{currentPrice.price * getTotalBalance() | number : "1.0-2"}} + +
+
+
+ +
+
+ + +
+
+ {{ address.alias }} ? +
+
+
+ {{ getEpochChanges(address.publicId) | number : "1.0-0" }} + arrow_upward + arrow_downward + arrow_forward +
+
+ {{getBalance(address.publicId) | number :"1.0-0"}} + ? +
+
+ ${{currentPrice.price * getBalance(address.publicId) | number : "1.0-2"}} +
+
+ +
+
+
+
+
+ + +
+
+

+ {{ seed.alias }} - ? + {{getBalance(seed.publicId) | number : "1.0-0"}} + {{ t("general.currency") }} +

+
+
+ {{ getEpochChanges(seed.publicId) | number : "1.0-0" }} + arrow_upward + arrow_downward + arrow_forward +
+ +
+
+ {{ seed.publicId }} +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ t("seedOverviewComponent.table.alias") }} + {{ element.alias }} + {{ t("seedOverviewComponent.table.publicId") }} + +
+ {{ element.publicId }} +
+
+ {{ t("seedOverviewComponent.table.balance") }} + +
+ hourglass_empty + ? + {{ + getBalance(element.publicId) | number : "1.0-0" + }} +
+
+ {{ t("seedOverviewComponent.table.epochChanges") }} + +
+ ? + + {{ getEpochChanges(element.publicId) | number : "1.0-0" }} + arrow_upward + arrow_downward + arrow_forward + +
+
+ {{ t("seedOverviewComponent.table.actions.title") }} + + +
+ {{ t("seedOverviewComponent.table.noData", { q: input.value }) }} +
+
+ + + + + + + + + +
diff --git a/src/app/main/main.component.scss b/src/app/main/main.component.scss new file mode 100644 index 0000000..3765309 --- /dev/null +++ b/src/app/main/main.component.scss @@ -0,0 +1,76 @@ +.seedList { + display: flex; + flex-direction: column; + gap: 20px; + + h3 { + font-weight: bold; + margin-bottom: 0px;; + } +} +.mobileSeedItem { + padding-bottom: 10px; + border-bottom: 1px solid gray; +} +.mobileActionLine { + display: flex; + flex-wrap: wrap; +} +.epochChanges { + display: flex; + align-items: center; +} +.cardEpochChanges { + margin-bottom: -20px; +} +.down, .up{ + display: none; +} +.straight{ + display: inline; +} +.isPositiv { + .down, .straight{ + display: none; + } + .up{ + display: inline; + } +} +.isNegativ { + .up, .straight{ + display: none; + } + .down{ + display: inline; + } +} + + +.card-list { + gap: 0px 20px; + +} + +mat-card { + min-width: 385px; +} + +::ng-deep { + .is-mobile { + mat-card { + min-width: 320px; + } + } +} + + +.dashboard-balance-name { + font-weight: bold; + margin-bottom: 20px; + margin-top: 20px; +} + +.mat-mdc-form-field { + width: 100%; +} diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts new file mode 100644 index 0000000..6cc384a --- /dev/null +++ b/src/app/main/main.component.ts @@ -0,0 +1,316 @@ +import { AfterViewInit, Component, ElementRef, HostListener, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatTable, MatTableDataSource } from '@angular/material/table'; +import { ConfirmDialog } from '../core/confirm-dialog/confirm-dialog.component'; +import { UnLockComponent } from '../lock/unlock/unlock.component'; +import { ISeed } from '../model/seed'; +import { WalletService } from '../services/wallet.service'; +import { SeedEditDialog } from './edit-seed/seed-edit.component'; +import { RevealSeedDialog } from './reveal-seed/reveal-seed.component'; +import { Router } from '@angular/router'; +import { QrReceiveDialog } from './qr-receive/qr-receive.component'; +import { BalanceResponse, NetworkBalance, Transaction, MarketInformation } from '../services/api.model'; +import { MatSort } from '@angular/material/sort'; +import { UpdaterService } from '../services/updater-service'; +import { QubicService } from '../services/qubic.service'; +import { PublicKey } from 'qubic-ts-library/dist/qubic-types/PublicKey'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { QubicEntityResponse } from 'qubic-ts-library/dist/qubic-communication/QubicEntityResponse'; +import { DecimalPipe } from '@angular/common'; +import { AssetsDialog } from './assets/assets.component'; +import { LoadConfigDialog } from '../lock/load-config/load-config.component'; +import { ExportConfigDialog } from '../lock/export-config/export-config.component'; +import { MatSlideToggleChange } from '@angular/material/slide-toggle'; +import { DeviceDetectorService } from 'ngx-device-detector'; + + +@Component({ + selector: 'qli-main', + templateUrl: './main.component.html', + styleUrls: ['./main.component.scss'] +}) +export class MainComponent implements AfterViewInit { + + displayedColumns: string[] = ['alias', 'publicId', 'balance', 'currentEstimatedAmount', 'actions']; + dataSource!: MatTableDataSource; + balances: BalanceResponse[] = []; + public transactions: Transaction[] = []; + isTable: boolean = false; + currentPrice: MarketInformation = ({ supply: 0, price: 0, capitalization: 0, currency: 'USD' }); + public isMobile = false; + + @ViewChild(MatTable) + table!: MatTable; + + @ViewChild(MatSort) + sort!: MatSort; + + constructor( + public walletService: WalletService, + public dialog: MatDialog, + private router: Router, + private updaterService: UpdaterService, + private q: QubicService, + private _snackBar: MatSnackBar, + private t: TranslocoService, + private decimalPipe: DecimalPipe, + private deviceService: DeviceDetectorService, + ) { + this.isMobile = deviceService.isMobile(); + var dashBoardStyle = localStorage.getItem("dashboard-grid"); + this.isTable = dashBoardStyle == '0' ? true : false; + + this.updaterService.currentPrice.subscribe(response => { + this.currentPrice = response; + }, errorResponse => { + this._snackBar.open(errorResponse.error, this.t.translate("general.close"), { + duration: 0, + panelClass: "error" + }); + }); + + this.setDataSource(); + updaterService.currentBalance.subscribe(b => { + this.balances = b; + this.setDataSource(); + }) + + updaterService.internalTransactions.subscribe(txs => { + this.transactions = txs; + }); + + if (this.dataSource.data.length == 0) { + this.load(); + } + } + + @HostListener('document:keydown.escape', ['$event']) + handleEscapeKey(event: KeyboardEvent): void { + const disableAreasElements = document.querySelectorAll('.disable-area') as NodeListOf; + disableAreasElements.forEach((area: HTMLElement) => { + if (area.classList.contains('blurred')) { + area.classList.remove('blurred'); + } else { + area.classList.add('blurred'); + } + }); + } + + ngAfterViewInit(): void { + this.setDataSource(); + } + + setDataSource(): void { + this.dataSource = new MatTableDataSource(this.walletService.getSeeds().map(m => { + if (!this.walletService.getSettings().useBridge) { + if (!m.balanceTick || m.balanceTick === 0) { + m.balance = this.getDeprecatedBalance(m.publicId); + (m).currentEstimatedAmount = this.getEpochChanges(m.publicId); + m.lastUpdate = this.getDeprecatedLastUpdate(m.publicId); + } + } + return m; + })); + this.dataSource.sort = this.sort; + } + + toggleTableView(event: MatSlideToggleChange) { + this.isTable = !this.isTable; + localStorage.setItem("dashboard-grid", this.isTable ? '0' : '1'); + this.isTable = event.checked; + } + + + load(): void { + const dialogRef = this.dialog.open(LoadConfigDialog, { disableClose: true, }); + + // Manually restore focus to the menu trigger since the element that + // opens the dialog won't be in the DOM any more when the dialog closes. + dialogRef.afterClosed().subscribe(() => { + // do anything :) + }); + } + + getDeprecatedBalance(publicId: string): number { + var balanceEntry = this.balances.find(f => f.publicId === publicId); + return balanceEntry?.currentEstimatedAmount ?? balanceEntry?.epochBaseAmount ?? 0; + } + + getDeprecatedLastUpdate(publicId: string): Date | undefined { + var balanceEntry = this.balances.find(f => f.publicId === publicId); + return balanceEntry ? new Date() : undefined; + } + + getTotalBalance(): number { + return Number(this.walletService.getSeeds().reduce((p,c) => p + c.balance, 0) ?? BigInt(0)); + } + + getBalance(publicId: string): number { + return Number(this.walletService.getSeed(publicId)?.balance ?? BigInt(0)); + } + + + getEpochChanges(publicId: string): number { + var balanceEntry = this.balances.find(f => f.publicId === publicId); + return this.getBalance(publicId) - (balanceEntry?.epochBaseAmount ?? 0); // balanceEntry?.epochChanges ?? 0; + } + + refreshData() { + this.setDataSource(); + this.table.renderRows(); + this.updaterService.forceLoadAssets(); + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value; + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + + addSeed() { + if (!this.walletService.privateKey) { + const dialogRef = this.dialog.open(UnLockComponent, { restoreFocus: false }); + dialogRef.afterClosed().subscribe((r) => { + if (this.walletService.privateKey) { + const dialogRef = this.dialog.open(SeedEditDialog, { + restoreFocus: false, data: { + seed: null + } + }); + dialogRef.afterClosed().subscribe(result => { + // do anything :) + this.refreshData(); + if (result) { + this.openExportDialog(); + } + }); + } + }); + } else { + const dialogRef = this.dialog.open(SeedEditDialog, { + restoreFocus: false, data: { + seed: null + } + }); + dialogRef.afterClosed().subscribe(result => { + this.setDataSource(); + this.refreshData(); + if (result) { + this.openExportDialog(); + } + }) + } + } + + payment(publicId: string) { + this.router.navigate(['/', 'payment'], { + queryParams: { + publicId: publicId + } + }); + } + + edit(publicId: string) { + const confirmDialo = this.dialog.open(SeedEditDialog, { + restoreFocus: false, data: { + publicId: publicId + } + }); + confirmDialo.afterClosed().subscribe(result => { + if (result) { + this.openExportDialog(); + } + }) + } + + openExportDialog(disableClose = true) { + const dialogRef = this.dialog.open(ExportConfigDialog, { disableClose: disableClose, }); + dialogRef.afterClosed().subscribe(() => { + // do anything :) + }); + } + + receive(publicId: string) { + const qrDialog = this.dialog.open(QrReceiveDialog, { + restoreFocus: false, data: { + publicId: publicId + } + }); + } + + hasAssets(publicId: string): boolean { + return (this.walletService.getSeed(publicId)?.assets?.length ?? 0) > 0; + } + + reveal(publicId: string) { + const confirmDialo = this.dialog.open(RevealSeedDialog, { + restoreFocus: false, data: { + publicId: publicId + } + }); + } + assets(publicId: string) { + const confirmDialo = this.dialog.open(AssetsDialog, { + restoreFocus: false, data: { + publicId: publicId + } + }); + } + + + delete(publicId: string) { + const confirmDialo = this.dialog.open(ConfirmDialog, { restoreFocus: false }); + confirmDialo.afterClosed().subscribe(result => { + if (result) { + this.walletService.deleteSeed(publicId); + this.refreshData(); + this.openExportDialog(); + } + }) + } + + refreshBalance(publicId: string) { + if (this.walletService.getSettings().useBridge) { + if (!this.q.isConnected.getValue()) { + this._snackBar.open(this.t.translate('general.messages.notConnected'), this.t.translate('general.close'), { + duration: 10000, + panelClass: "error" + }); + } else { + if (this.q.updateBalance(new PublicKey(publicId), (entityResponse: QubicEntityResponse): boolean => { + if (entityResponse.getEntity().getPublicKey().equals(new PublicKey(publicId))) { + this._snackBar.open(this.t.translate('general.messages.balanceReceived', { publicId: publicId, balance: this.decimalPipe.transform(entityResponse.getEntity().getBalance(), '1.0-0') }), this.t.translate('general.close'), { + duration: 10000, + }); + return true; + } + return false; + })) { + this._snackBar.open(this.t.translate('general.messages.refreshRequested'), this.t.translate('general.close'), { + duration: 5000, + }); + } else { + this._snackBar.open(this.t.translate('general.messages.refreshFailed'), this.t.translate('general.close'), { + duration: 10000, + panelClass: "error" + }); + } + } + } else { + this.updaterService.forceUpdateNetworkBalance(publicId, (balances: NetworkBalance[]) => { + if (balances) { + var entry = balances.find(f => f.publicId == publicId); + if (entry) { + this._snackBar.open(this.t.translate('general.messages.balanceReceived', { publicId: publicId, balance: this.decimalPipe.transform(entry.amount, '1.0-0') }), this.t.translate('general.close'), { + duration: 5000, + }); + } + } + }); + } + } + + hasPendingTransaction(publicId: string) { + return this.transactions.find(t => (t.sourceId == publicId || t.destId == publicId) && t.isPending); + } +} diff --git a/src/app/main/qr-receive/qr-receive.component.html b/src/app/main/qr-receive/qr-receive.component.html new file mode 100644 index 0000000..24d0f3f --- /dev/null +++ b/src/app/main/qr-receive/qr-receive.component.html @@ -0,0 +1,15 @@ + +

{{ t("qrReceiveComponent.title")}}

+ + + + {{ t("qrReceiveComponent.downloadLink") }} +
+ {{ t("qrReceiveComponent.hint", { publicId: data.publicId})}} +
+ +
+ + + +
diff --git a/src/app/main/qr-receive/qr-receive.component.scss b/src/app/main/qr-receive/qr-receive.component.scss new file mode 100644 index 0000000..3a64f77 --- /dev/null +++ b/src/app/main/qr-receive/qr-receive.component.scss @@ -0,0 +1,8 @@ +mat-dialog-content { + display: flex; + align-items: center; + flex-direction: column; + max-width: 700px; + text-align: center; + word-break: break-all; +} \ No newline at end of file diff --git a/src/app/main/qr-receive/qr-receive.component.ts b/src/app/main/qr-receive/qr-receive.component.ts new file mode 100644 index 0000000..e1f22d4 --- /dev/null +++ b/src/app/main/qr-receive/qr-receive.component.ts @@ -0,0 +1,34 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { ChangeDetectorRef, Component, Inject, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import {MatDialog, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import { IDecodedSeed, ISeed } from 'src/app/model/seed'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { UnLockComponent } from 'src/app/lock/unlock/unlock.component'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; + + +@Component({ + selector: 'qli-qr-receive', + templateUrl: './qr-receive.component.html', + styleUrls: ['./qr-receive.component.scss'] +}) +export class QrReceiveDialog extends QubicDialogWrapper { + + public qrCode: string = ""; + public qrCodeDownloadLink: SafeUrl = ""; + + constructor(renderer: Renderer2, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, chgd: ChangeDetectorRef, private walletService: WalletService, dialog: Dialog, private fb: FormBuilder, private dialogRef: DialogRef,private _snackBar: MatSnackBar) { + super(renderer, themeService); + this.qrCode = 'https://wallet.qubic.li/payment/' + data.publicId + } + + onChangeURL(url: SafeUrl) { + this.qrCodeDownloadLink = url; + } + +} diff --git a/src/app/main/reveal-seed/reveal-seed.component.html b/src/app/main/reveal-seed/reveal-seed.component.html new file mode 100644 index 0000000..31811a8 --- /dev/null +++ b/src/app/main/reveal-seed/reveal-seed.component.html @@ -0,0 +1,28 @@ + +

{{ t("revealSeedComponent.title") }}

+ +
+ {{ t("revealSeedComponent.publicId") }} +
+ {{ data.publicId }} +
+ {{ t("revealSeedComponent.privateId") }} +
+ {{ s }} +
+
+
+ + + +
diff --git a/src/app/main/reveal-seed/reveal-seed.component.scss b/src/app/main/reveal-seed/reveal-seed.component.scss new file mode 100644 index 0000000..b034b84 --- /dev/null +++ b/src/app/main/reveal-seed/reveal-seed.component.scss @@ -0,0 +1,11 @@ +.seedInput { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + row-gap: 10px; + word-break: break-all; + mat-form-field { + width: 100%; + } +} diff --git a/src/app/main/reveal-seed/reveal-seed.component.ts b/src/app/main/reveal-seed/reveal-seed.component.ts new file mode 100644 index 0000000..b9d1e3d --- /dev/null +++ b/src/app/main/reveal-seed/reveal-seed.component.ts @@ -0,0 +1,30 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { ChangeDetectorRef, Component, Inject, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { IDecodedSeed, ISeed } from 'src/app/model/seed'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { UnLockComponent } from 'src/app/lock/unlock/unlock.component'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; + + +@Component({ + selector: 'qli-reveal-seed', + templateUrl: './reveal-seed.component.html', + styleUrls: ['./reveal-seed.component.scss'] +}) +export class RevealSeedDialog extends QubicDialogWrapper { + public s = ''; + constructor(renderer: Renderer2, themeService: ThemeService, @Inject(MAT_DIALOG_DATA) public data: any, chgd: ChangeDetectorRef, private walletService: WalletService, dialog: Dialog, private fb: FormBuilder, private dialogRef: DialogRef, private _snackBar: MatSnackBar) { + super(renderer, themeService); + this.walletService.revealSeed(data.publicId).then(s => { + this.s = s; + chgd.detectChanges(); + }); + } + + +} diff --git a/src/app/model/config.ts b/src/app/model/config.ts new file mode 100644 index 0000000..e649c77 --- /dev/null +++ b/src/app/model/config.ts @@ -0,0 +1,26 @@ +import { ISeed } from "./seed"; + +export interface IConfig { + name?: string; // wallet name + seeds: ISeed[]; + publicKey?: JsonWebKey; + webBridges: string[]; + useBridge: boolean; + tickAddition: number; + enableBeta: boolean; +} + +/** + * interface for the vault file definition + */ +export interface IVaultFile { + privateKey: string; /* base64 */ + publicKey: JsonWebKey; + configuration: IConfig +} + +export interface IEncryptedVaultFile { + salt: string; + iv: string; + cipher: string; +} \ No newline at end of file diff --git a/src/app/model/seed.ts b/src/app/model/seed.ts new file mode 100644 index 0000000..99e7453 --- /dev/null +++ b/src/app/model/seed.ts @@ -0,0 +1,16 @@ +import { QubicAsset } from "../services/api.model"; + +export interface ISeed { + alias: string; + publicId: string; + // publicKey: Uint8Array; // currently not used + encryptedSeed: string; + balance: number; + balanceTick: number; + lastUpdate?: Date; + assets?: QubicAsset[]; + isExported?: boolean; +} +export interface IDecodedSeed extends ISeed { + seed: string; +} \ No newline at end of file diff --git a/src/app/model/tx.ts b/src/app/model/tx.ts new file mode 100644 index 0000000..3728ff3 --- /dev/null +++ b/src/app/model/tx.ts @@ -0,0 +1,6 @@ +export interface ITx { + id: string; + sourceId: string; + destId: string; + status: number; +} \ No newline at end of file diff --git a/src/app/navigation/navigation.component.html b/src/app/navigation/navigation.component.html new file mode 100644 index 0000000..6da94bd --- /dev/null +++ b/src/app/navigation/navigation.component.html @@ -0,0 +1,146 @@ + +
+ +
+ +
+ +
+
+ {{ t("general.currentTick", { tick: "" }) }} {{ + us.currentTick.getValue() | number : "1.0-0" + }} +
+ + + + + + +
+
+
+
+ +
+
+
+
+ +
+
+ + + + home{{ t("general.navigation.home") }} + payments{{ t("general.navigation.payment") }} + account_balance{{ t("general.navigation.balance") }} + category{{ t("general.navigation.assets") }} + how_to_vote{{ t("general.navigation.voting") }} + multiline_chart{{ t("general.navigation.ipo") }} + settings{{ t("general.navigation.settings") }} + + +
+
+ Theme Switch +

+ {{ t("general.version", { version: version }) }}
+ © {{ t("general.version.url") }}
+
+
+
+ + + + +
+
+
diff --git a/src/app/navigation/navigation.component.scss b/src/app/navigation/navigation.component.scss new file mode 100644 index 0000000..9a04b58 --- /dev/null +++ b/src/app/navigation/navigation.component.scss @@ -0,0 +1,107 @@ +@import "../../vars.scss"; + +.container { + max-width: 1920px; + margin: 0 auto; + display: flex; + flex-direction: column; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + + +mat-sidenav-container{ + border: 1px solid #E0E0E0; +} + +::ng-deep { + .darkTheme { + mat-sidenav-container{ + + border: 0px solid #222930; + border-top: 1px solid #222930; + } + } +} + + + +h1.app-name { + margin-left: 8px; +} + +.sidenav-container { + /* When the sidenav is not fixed, stretch the sidenav container to fill the available space. This + causes `` to act as our scrolling element for desktop layouts. */ + flex: 1; +} + +.is-mobile .sidenav-container { + /* When the sidenav is fixed, don't constrain the height of the sidenav container. This allows the + `` to be our scrolling element for mobile layouts. */ + flex: 1 0 auto; +} + +.icon{ + font-size: 20px;; +} + +.open-wallet-screen{ + max-width: 700px; + margin-top: 56px; + align-items: center; + margin-left: auto; + margin-right: auto; + padding: 16px; +} + + +.version { + margin-top: 20px; + text-align: center; + margin-bottom: 10px; +} + +.topIcons { + flex:1; + display: flex; + align-items: center; + justify-content: flex-end; +} +.left-icon-area { + flex:1; + display: flex; + align-items: center; +} + +.header_logo { + flex:1; + text-align: center; +} + +.logo { + max-height: 64px; +} + +.is-mobile { + h1 { + font-size:1.2em; + } + .toolbar { + position: fixed; + /* Make sure the toolbar will stay on top of the content as it scrolls past. */ + z-index: 2; + } + .logo { + max-width: 150px; + } + .currentTick { + max-width: 75px; + .title { + display: none; + } + } +} \ No newline at end of file diff --git a/src/app/navigation/navigation.component.spec.ts b/src/app/navigation/navigation.component.spec.ts new file mode 100644 index 0000000..cf90c6e --- /dev/null +++ b/src/app/navigation/navigation.component.spec.ts @@ -0,0 +1,40 @@ +import { LayoutModule } from '@angular/cdk/layout'; +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatToolbarModule } from '@angular/material/toolbar'; + +import { NavigationComponent } from './navigation.component'; + +describe('NavigationComponent', () => { + let component: NavigationComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [NavigationComponent], + imports: [ + NoopAnimationsModule, + LayoutModule, + MatButtonModule, + MatIconModule, + MatListModule, + MatSidenavModule, + MatToolbarModule, + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavigationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should compile', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/navigation/navigation.component.ts b/src/app/navigation/navigation.component.ts new file mode 100644 index 0000000..86530aa --- /dev/null +++ b/src/app/navigation/navigation.component.ts @@ -0,0 +1,160 @@ +import { ChangeDetectorRef, Component, OnInit, ViewChild, Renderer2 } from '@angular/core'; +import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; +import { Observable } from 'rxjs'; +import { map, shareReplay } from 'rxjs/operators'; +import { MediaMatcher } from '@angular/cdk/layout'; +import { WalletService } from '../services/wallet.service'; +import { ThemeService } from '../services/theme.service'; +import { environment } from 'src/environments/environment'; +import { UpdaterService } from '../services/updater-service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { MarketInformation } from '../services/api.model'; +import { EnvironmentService } from '../services/env.service'; +import { ActivatedRoute, Router } from '@angular/router'; + + +@Component({ + selector: 'app-navigation', + templateUrl: './navigation.component.html', + styleUrls: ['./navigation.component.scss'] +}) +export class NavigationComponent implements OnInit { + + @ViewChild("snav") snav: any; + + isHandset$: Observable = this.breakpointObserver.observe(Breakpoints.Handset) + .pipe( + map(result => result.matches), + shareReplay() + ); + + + mobileQuery!: MediaQueryList; + title = 'qubic-wallet'; + public version = 0.0; + public higlightTick = false; + private currentTick = 0; + private currentErrorState = ""; + private isMaximized = false; + public showMinimize = false; + public currentPrice: MarketInformation = ({ supply: 0, price: 0, capitalization: 0, currency: 'USD' }); + private _mobileQueryListener!: () => void; + + constructor(private renderer: Renderer2, private cd: ChangeDetectorRef, public us: UpdaterService, + private transloco: TranslocoService, private _snackBar: MatSnackBar, + public themeService: ThemeService, private breakpointObserver: BreakpointObserver, + public walletService: WalletService, private changeDetectorRef: ChangeDetectorRef, private media: MediaMatcher, + public environmentService: EnvironmentService) { + } + + ngOnInit(): void { + + + this.mobileQuery = this.media.matchMedia('(max-width: 600px)'); + this._mobileQueryListener = () => this.changeDetectorRef.detectChanges(); + this.mobileQuery.addListener(this._mobileQueryListener); + this.version = environment.version; + + this.renderer.addClass(document.body, this.themeService.isDarkTheme ? 'darkTheme' : 'light'); + + // if ((window).require) { + // this.showMinimize = true; + // } + + this.us.currentPrice.subscribe(response => { + this.currentPrice = response; + }, errorResponse => { + this._snackBar.open(errorResponse.error, this.transloco.translate("general.close"), { + duration: 0, + panelClass: "error" + }); + }); + + this.us.currentTick.subscribe(s => { + if (s && s > this.currentTick) { + this.currentTick = s; + this.higlightTick = true; + this.cd.detectChanges(); + setTimeout(() => { + this.higlightTick = false; + }, (1000)); + } + }); + + this.us.errorStatus.subscribe(s => { + if (s != "" && s != this.currentErrorState) { + this.currentErrorState = s; + this._snackBar.open(this.currentErrorState, this.transloco.translate("general.close"), { + duration: 0, + panelClass: "error" + }); + } + }) + } + + + ngOnDestroy(): void { + this.mobileQuery.removeListener(this._mobileQueryListener); + } + + checkMobileToggle() { + if (this.mobileQuery.matches) { + this.snav.toggle(); + } + } + + close() { + // if (window.require) { + // const electron = window.require('electron'); + // const win = (electron).remote.getCurrentWindow(); + // win.close(); + // } else { + this.walletService.lock(); + window.close(); + // } + } + + minimize() { + // const electron = window.require('electron'); + // const win = (electron).remote.getCurrentWindow(); + //win.minimize(); + } + + maximize() { + this.isMaximized = !this.isMaximized; + // if ((window).require) { + // const { remote } = window.require('electron-remote'); + // // Retrieve focused window + // const win = remote.getCurrentWindow(); + // this.isMaximized ? win.unmaximize() : win.maximize(); + // } else { + this.isMaximized ? this.openFullscreen() : this.closeFullscreen(); + // } + } + + + /* View in fullscreen */ + private openFullscreen() { + var elem = document.documentElement; + if (this.isMaximized) { + elem.requestFullscreen(); + } else if ((elem).webkitRequestFullscreen) { /* Safari */ + (elem).webkitRequestFullscreen(); + } else if ((elem).msRequestFullscreen) { /* IE11 */ + (elem).msRequestFullscreen(); + } + } + + /* Close fullscreen */ + private closeFullscreen() { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if ((document).webkitExitFullscreen) { /* Safari */ + (document).webkitExitFullscreen(); + } else if ((document).msExitFullscreen) { /* IE11 */ + (document).msExitFullscreen(); + } + } + +} diff --git a/src/app/notifys/notifys.component.html b/src/app/notifys/notifys.component.html new file mode 100644 index 0000000..65fb3dd --- /dev/null +++ b/src/app/notifys/notifys.component.html @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/src/app/notifys/notifys.component.scss b/src/app/notifys/notifys.component.scss new file mode 100644 index 0000000..79a4114 --- /dev/null +++ b/src/app/notifys/notifys.component.scss @@ -0,0 +1,6 @@ +.online { + color: green; +} +.offline { + color: red; +} \ No newline at end of file diff --git a/src/app/notifys/notifys.component.ts b/src/app/notifys/notifys.component.ts new file mode 100644 index 0000000..e889346 --- /dev/null +++ b/src/app/notifys/notifys.component.ts @@ -0,0 +1,74 @@ +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { WalletService } from '../services/wallet.service'; +import {MatDialog} from '@angular/material/dialog'; +import { LockConfirmDialog } from '../lock/confirm-lock/confirm-lock.component'; +import { QubicService } from '../services/qubic.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { ExportComponent } from '../settings/export/export.component'; +import { ExportConfigDialog } from '../lock/export-config/export-config.component'; + + +@Component({ + selector: 'qli-notifys', + templateUrl: './notifys.component.html', + styleUrls: ['./notifys.component.scss'] +}) +export class NotifysComponent implements OnInit { + + public isNodeConnected = false; + public useBridge = false; + private vaultSaverAcive = false; + + constructor(private cd: ChangeDetectorRef, public walletService: WalletService, public dialog: MatDialog, private q: QubicService, private transloco: TranslocoService, private _snackBar: MatSnackBar){ + + } + ngOnInit(): void { + this.q.isConnected.subscribe(s => { + this.isNodeConnected = s; + this.cd.detectChanges(); + }); + this.walletService.onConfig.subscribe(s => { + this.useBridge = s.useBridge; + if(this.hasUnsavedSeeds()) { + this.saveSettings(true); + } + this.cd.detectChanges(); + }); + } + + connect(): void{ + this.q.connect(); + } + disconnect(): void{ + this.q.disconnect(); + } + + sync(): void { + + } + + hasUnsavedSeeds(){ + return this.walletService.getSeeds().find(f => !f.isExported); + } + + saveSettings(force = false): void { + if(!this.vaultSaverAcive){ + this.vaultSaverAcive = true; + this.dialog.open(ExportConfigDialog, {disableClose: force}).afterClosed().subscribe(s => { + this.vaultSaverAcive = false; + }); + } + } + + lock(): void { + const dialogRef = this.dialog.open(LockConfirmDialog, {restoreFocus: false}); + + // Manually restore focus to the menu trigger since the element that + // opens the dialog won't be in the DOM any more when the dialog closes. + dialogRef.afterClosed().subscribe(() => { + // do anything :) + }); + } + +} diff --git a/src/app/payment/payment.component.html b/src/app/payment/payment.component.html new file mode 100644 index 0000000..bd9862a --- /dev/null +++ b/src/app/payment/payment.component.html @@ -0,0 +1,136 @@ + +
+

{{ t("paymentComponent.title") }}

+ +
+ + +
+
+ + {{ t("paymentComponent.form.sourceSeed.label") }} + + + {{seed.alias}} {{ seed.publicId }} {{ seed.balance | number: '1.0-0'}} + + + + {{ t("paymentComponent.form.sourceSeed.error.required") }} + + +
+
+
+
+ + + {{ t("paymentComponent.form.receiver.placeholder") }} + + + {{seed.alias}} {{ seed.publicId }} {{ seed.balance | number: '1.0-0'}} + + + + {{ t("paymentComponent.form.receiver.error.required") }} + + + + {{ t("paymentComponent.form.receiver.placeholder") }} + + + + {{ t("paymentComponent.form.receiver.hint") }} + {{ transferForm.controls['destinationId'].value?.length }} / + 60 + + {{ t("paymentComponent.form.receiver.error.required") }} + + + {{ t("paymentComponent.form.receiver.error.length") }} + + +
+
+
+
+ + {{ t("paymentComponent.form.amount.placeholder") }} + + + + + + {{ t("paymentComponent.form.amount.error.required") }} + + + {{ t("paymentComponent.form.amount.error.min") }} + + {{ transferForm.controls['amount'].value | number: '1.0-0' }} / + {{ maxAmount | number: '1.0-0' }} {{ t("general.currency") }} + +
+
+ + {{ t("paymentComponent.form.tick.placeholder") }} + + + {{ t("paymentComponent.form.tick.error.required") }} + + + {{ t("paymentComponent.form.tick.error.min", {currentTick: currentTick | number: '1.0-0'})}} + + + +
+
+
+ + +
+ +
+ +
+
+
+
+
\ No newline at end of file diff --git a/src/app/payment/payment.component.scss b/src/app/payment/payment.component.scss new file mode 100644 index 0000000..e4a9bf3 --- /dev/null +++ b/src/app/payment/payment.component.scss @@ -0,0 +1,38 @@ +@import "../../vars.scss"; + +.full-width { + width: 100%; +} + +.transfer-card { + min-width: 120px; + margin: 20px auto; +} + +.mat-radio-button { + display: block; + margin: 5px 0; +} + +.row { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} + +.col { + flex: 1; + margin-right: 20px; + margin-bottom: 15px; +} + +.col:last-child { + margin-right: 0; +} + +.padding button { + margin: 10px; +} +.tickOverwrite { + color: $mainColor +} \ No newline at end of file diff --git a/src/app/payment/payment.component.ts b/src/app/payment/payment.component.ts new file mode 100644 index 0000000..352dd13 --- /dev/null +++ b/src/app/payment/payment.component.ts @@ -0,0 +1,208 @@ +import { ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormControl, Validators } from '@angular/forms'; +import { MatCheckbox, MatCheckboxChange } from '@angular/material/checkbox'; +import { MatDialog } from '@angular/material/dialog'; +import { UnLockComponent } from '../lock/unlock/unlock.component'; +import { WalletService } from '../services/wallet.service'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { ApiService } from '../services/api.service'; +import { Router, ActivatedRoute, ParamMap } from '@angular/router'; +import { UpdaterService } from '../services/updater-service'; +import { CurrentTickResponse, Transaction } from '../services/api.model'; +import { TranslocoService } from '@ngneat/transloco'; +import { concatMap, of } from 'rxjs'; +import { QubicTransaction } from 'qubic-ts-library/dist/qubic-types/QubicTransaction'; +import { RequestResponseHeader } from 'qubic-ts-library/dist/qubic-communication/RequestResponseHeader'; +import { QubicConnector } from 'qubic-ts-library/dist/QubicConnector'; +import { QubicPackageBuilder } from 'qubic-ts-library/dist/QubicPackageBuilder'; +import { QubicPackageType } from 'qubic-ts-library/dist/qubic-communication/QubicPackageType'; +import { TransactionService } from '../services/transaction.service'; + +@Component({ + selector: 'app-wallet', + templateUrl: './payment.component.html', + styleUrls: ['./payment.component.scss'] +}) +export class PaymentComponent implements OnInit { + + + private selectedDestinationId: any; + public maxAmount: number = 0; + public currentTick = 0; + public isBroadcasting = false; + + @ViewChild('selectedDestinationId', { + static: false + }) set selectedDestinationIdContent(content: any) { + if (content) { // initially setter gets called with undefined + this.selectedDestinationId = content; + } + } + + public tickOverwrite = false; + public selectedAccountId = false; + + private destinationValidators = [Validators.required, Validators.minLength(60), Validators.maxLength(60)]; + private txTemplate: Transaction | undefined; + + transferForm = this.fb.group({ + sourceId: [''], + destinationId: ["", this.destinationValidators], + selectedDestinationId: [""], + amount: [10000, [Validators.required, Validators.min(1)]], + tick: [0, [Validators.required]], + }); + + constructor( + private t: TranslocoService, + private transactionService: TransactionService, + private router: Router, private us: UpdaterService, private fb: FormBuilder, private route: ActivatedRoute, private changeDetectorRef: ChangeDetectorRef, private api: ApiService, + private _snackBar: MatSnackBar, public walletService: WalletService, private dialog: MatDialog) { + const state = this.router.getCurrentNavigation()?.extras.state; + if (state && state['template']) { + this.txTemplate = state['template']; + } + } + + ngOnInit(): void { + this.us.currentTick.subscribe(tick => { + this.currentTick = tick; + this.transferForm.controls.tick.addValidators(Validators.min(tick)); + if (!this.tickOverwrite) { + this.transferForm.controls.tick.setValue(tick + this.walletService.getSettings().tickAddition); + } + }) + this.transferForm.controls.sourceId.valueChanges.subscribe(s => { + if (s) { + // try to get max amount + this.maxAmount = this.walletService.getSeed(s)?.balance ?? 0; + if (this.transferForm.controls.selectedDestinationId.value == this.transferForm.controls.sourceId.value) { + this.transferForm.controls.selectedDestinationId.setValue(null); + } + } + }); + + this.route.queryParams.subscribe(params => { + if (params['publicId']) { + const publicId = params['publicId']; + this.transferForm.controls.sourceId.setValue(publicId); + } + }); + this.route.params.subscribe(params => { + if (params['receiverId']) { + const publicId = params['receiverId']; + this.transferForm.controls.destinationId.setValue(publicId); + } + if (params['amount']) { + const amount = params['amount']; + this.transferForm.controls.amount.setValue(amount); + } + }); + + if (this.txTemplate) { + this.fillFromTemplate(this.txTemplate); + } + } + + fillFromTemplate(tx: Transaction) { + this.transferForm.controls.amount.setValue(tx.amount); + this.transferForm.controls.sourceId.setValue(tx.sourceId); + this.transferForm.controls.destinationId.setValue(tx.destId); + } + + setAmounToMax(addAmount: number = 0) { + this.transferForm.controls.amount.setValue(this.maxAmount + addAmount); + } + + init() { + this.transferForm.reset(); + this.transferForm.controls.amount.setValue(1); + this.us.forceUpdateCurrentTick(); + } + + async onSubmit() { + if (!this.walletService.privateKey) { + this._snackBar.open(this.t.translate('paymentComponent.messages.pleaseUnlock'), this.t.translate('general.close'), { + duration: 5000, + panelClass: "error" + }); + } + if (this.transferForm.valid) { + this.isBroadcasting = true; + this.walletService.revealSeed((this.transferForm.controls.sourceId.value)).then(s => { + let destinationId = this.selectedAccountId ? this.transferForm.controls.selectedDestinationId.value : this.transferForm.controls.destinationId.value; + of(this.transferForm.controls.tick.value!).pipe( + concatMap(data => { + if (!this.tickOverwrite) { + return this.api.getCurrentTick(); + } else { + return of({ + tick: data - this.walletService.getSettings().tickAddition, // fake because we add it afterwards; todo: do that right! + }); + } + })).subscribe(async tick => { + var qtx = new QubicTransaction(); + await qtx.setSourcePublicKey(this.transferForm.controls.sourceId.value!).setDestinationPublicKey(destinationId!).setAmount(this.transferForm.controls.amount.value!).setTick(tick.tick+this.walletService.getSettings().tickAddition).build(s); + + var publishResult = await this.transactionService.publishTransaction(qtx); + + if(publishResult && publishResult.success){ + this._snackBar.open(this.t.translate('paymentComponent.messages.storedForPropagation', {tick: qtx.tick }) , this.t.translate('general.close'), { + duration: 10000, + }); + this.isBroadcasting = false; + this.router.navigate(['/']); + } + else + { + this._snackBar.open(publishResult.message ?? this.t.translate('paymentComponent.messages.failedToSend'), this.t.translate('general.close'), { + duration: 10000, + panelClass: "error" + }); + this.isBroadcasting = false; + } + }); + }).catch(e => { + this._snackBar.open(this.t.translate('paymentComponent.messages.failedToDecrypt'), this.t.translate('general.close'), { + duration: 10000, + panelClass: "error" + }); + this.isBroadcasting = false; + }).finally(() => { + + }); + } else { + this._snackBar.open(this.t.translate('paymentComponent.messages.failedValidation'), this.t.translate('general.close'), { + duration: 5000, + panelClass: "error" + }); + } + } + + toggleDestinationSelect() { + this.selectedAccountId = !this.selectedAccountId; + this.changeDetectorRef?.detectChanges(); + if (this.selectedAccountId) { + this.selectedDestinationId.open(); + this.transferForm.controls.selectedDestinationId.addValidators([Validators.required]); + this.transferForm.controls.destinationId.clearValidators(); + this.transferForm.controls.destinationId.updateValueAndValidity(); + this.transferForm.controls.selectedDestinationId.updateValueAndValidity(); + } else { + this.transferForm.controls.destinationId.addValidators(this.destinationValidators); + this.transferForm.controls.selectedDestinationId.clearAsyncValidators(); + this.transferForm.controls.destinationId.updateValueAndValidity(); + this.transferForm.controls.selectedDestinationId.updateValueAndValidity(); + } + this.changeDetectorRef?.detectChanges(); + } + getSeeds(isDestination = false) { + return this.walletService.getSeeds().filter(f => !isDestination || f.publicId != this.transferForm.controls.sourceId.value) + } + + loadKey() { + const dialogRef = this.dialog.open(UnLockComponent, { restoreFocus: false }); + } +} + diff --git a/src/app/public/create-vault/create-vault.component.html b/src/app/public/create-vault/create-vault.component.html new file mode 100644 index 0000000..388da06 --- /dev/null +++ b/src/app/public/create-vault/create-vault.component.html @@ -0,0 +1,144 @@ + +
+ + + {{ t('createVaultComponent.createVault.stepTitle') }} {{ getVaultName() }} + {{ t('createVaultComponent.createVault.message') }} +

+
+ + {{ t('createVaultComponent.createVault.vaultName') }} + + + +
+
+ + {{ t('createVaultComponent.createAddress.title') }} {{ getVaultName() }} + {{ t('createVaultComponent.createAddress.message') }} +

+
+ + {{ t('createVaultComponent.createAddress.addressNam') }} + + + + {{ t('createVaultComponent.createAddress.seed') }} + + + +
+ {{ t('createVaultComponent.createAddress.publicId') }}
+ {{ + generatedPublicId + }}
+
+ + +
+
+
+ +
+ {{ t('createVaultComponent.downloadVault.stepTitle') }} {{ getVaultName() }} + {{ t('createVaultComponent.downloadVault.message') }} +

+ + + {{ t('createVaultComponent.downloadVault.password') }} + + + + +
+
+ +
+ {{ t('createVaultComponent.verifyVault.stpTitle') }} {{ getVaultName() }} + {{ t('createVaultComponent.verifyVault.message') }} +

+ + {{ t('createVaultComponent.verifyVault.password') }} + + + + +
+
+ + {{ t('createVaultComponent.done.stepTitle') }} {{ getVaultName() }} +

{{ t('createVaultComponent.done.message') }}

+
+ +
+
+
+ +
+ + +
+
+
diff --git a/src/app/public/create-vault/create-vault.component.scss b/src/app/public/create-vault/create-vault.component.scss new file mode 100644 index 0000000..820edb5 --- /dev/null +++ b/src/app/public/create-vault/create-vault.component.scss @@ -0,0 +1,7 @@ +.file-input { + display: none; +} + +.full-width { + width:100%; +} \ No newline at end of file diff --git a/src/app/public/create-vault/create-vault.component.ts b/src/app/public/create-vault/create-vault.component.ts new file mode 100644 index 0000000..89cdc81 --- /dev/null +++ b/src/app/public/create-vault/create-vault.component.ts @@ -0,0 +1,259 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { + ChangeDetectorRef, + Component, + Injector, + Renderer2, + ViewChild, +} from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialog } from 'src/app/core/confirm-dialog/confirm-dialog.component'; +import { TranslocoService } from '@ngneat/transloco'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; +import { UpdaterService } from 'src/app/services/updater-service'; +import { MatStepper } from '@angular/material/stepper'; +import { QubicHelper } from 'qubic-ts-library/dist/qubicHelper'; +import { IDecodedSeed } from 'src/app/model/seed'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'qli-create-vault', + templateUrl: './create-vault.component.html', + styleUrls: ['./create-vault.component.scss'], +}) +export class CreateVaultComponent extends QubicDialogWrapper { + @ViewChild('stepper') + private stepper: MatStepper | undefined; + + public vaultCreated = false; // steop 1 + public addressCreated = false; // step 2 + public generatedPublicId: string = ''; + public vaultExported = false; // steop 3 + public vaultVerified = false; // steop 4 + + public file: File | null = null; + public pwdWrong = false; + public selectedFileIsVaultFile = false; + private walletService: WalletService; + + createVaultForm = this.fb.group({ + name: [null, [Validators.required, Validators.minLength(3)]], + }); + + importForm = this.fb.group({ + password: [null, [Validators.required, Validators.minLength(8)]], + }); + + dialogRef: DialogRef | null = null; + + verifyVaultFormGroup = this._formBuilder.group({ + password: ['', Validators.required], + }); + vaultPasswordFormGroup = this._formBuilder.group({ + password: ['', [Validators.required, Validators.minLength(8)]], + }); + createAddressForm = this._formBuilder.group({ + name: ['Account 1', [Validators.required, Validators.minLength(3)]], + seed: [ + '', + [ + Validators.required, + Validators.minLength(55), + Validators.maxLength(55), + Validators.pattern('[a-z]{55}'), + ], + ], + }); + + constructor( + private _formBuilder: FormBuilder, + renderer: Renderer2, + themeService: ThemeService, + public updaterService: UpdaterService, + private transloco: TranslocoService, + private router: Router, + private fb: FormBuilder, + private dialog: MatDialog, + private _snackBar: MatSnackBar, + private injector: Injector, + private changeDetector: ChangeDetectorRef, + private persistedWalletService: WalletService + ) { + super(renderer, themeService); + this.dialogRef = injector.get(DialogRef, null); + + this.walletService = new WalletService(false); + + this.createAddressForm.controls.seed.valueChanges.subscribe((s) => { + if (s) this.generatePublicId(s); + }); + } + + private nextStep() { + window.setTimeout(() => { + this.stepper?.next(); + }, 500); + } + + public async generatePublicId(seed: string) { + if (seed && seed.length == 55) { + const helper = new QubicHelper(); + const idp = await helper.createIdPackage(seed); + this.generatedPublicId = idp.publicId; + this.changeDetector.detectChanges(); + } else { + this.generatedPublicId = ''; + } + } + + public randomizeSeed() { + this.createAddressForm.controls.seed.setValue(this.seedGen()); + } + + private seedGen(): string { + const letters = 'abcdefghijklmnopqrstuvwxyz'; + const letterSize = letters.length; + let seed = ''; + for (let i = 0; i < 55; i++) { + seed += letters[Math.floor(Math.random() * letterSize)]; + } + return seed; + } + + public createVault() { + this.gengerateNew(); + } + + public async createAddress() { + if (this.createAddressForm.valid) { + const seed = this.createAddressForm.controls.seed.value; + if (seed && seed.length == 55) { + const helper = new QubicHelper(); + const idp = await helper.createIdPackage(seed); + const toSaveSeed = { + alias: this.createAddressForm.controls.name.value!, + publicId: idp.publicId, + seed: seed, + balance: 0, + }; + this.walletService.addSeed(toSaveSeed); + this.addressCreated = true; + this.nextStep(); + } + } + } + + public exportVault() { + this.downloadVaultFile(); + } + + public verifyVault() { + this.importAndUnlock(this.walletService); + } + + public async openWallet() { + await this.importAndUnlock(this.persistedWalletService); + this.updaterService.loadCurrentBalance(true); + this.router.navigate(['/']); + } + + async downloadVaultFile() { + if (this.vaultPasswordFormGroup.valid && this.walletService.privateKey) { + if ( + await this.walletService.exportVault( + this.vaultPasswordFormGroup.controls.password.value! + ) + ) { + this.vaultExported = true; + this.nextStep(); + } + } + } + + async startCreateProcess() { + this.walletService.clearConfig(); + await this.walletService.createNewKeys(); + this.walletService.updateName(this.createVaultForm.controls.name.value!); + this.vaultCreated = true; + this.nextStep(); + } + + async gengerateNew() { + if (this.hasExistingConfig()) { + const confirmDialo = this.dialog.open(ConfirmDialog, { + restoreFocus: false, + data: { + message: this.transloco.translate('unlockComponent.overwriteVault'), + }, + }); + confirmDialo.afterClosed().subscribe((result) => { + if (result) { + this.startCreateProcess(); + } + }); + } else { + this.startCreateProcess(); + } + } + + private async importAndUnlock(service: WalletService) { + // one vault file + const binaryFileData = await this.file?.arrayBuffer(); + if (binaryFileData) { + const success = await service.importVault( + binaryFileData, + this.verifyVaultFormGroup.controls.password.value + ); + if (success) { + this.pwdWrong = false; + service.isWalletReady = true; + this.vaultVerified = true; + this.nextStep(); + } else { + this._snackBar.open( + 'Import Failed (passord or file do not match)', + 'close', + { + duration: 5000, + panelClass: 'error', + } + ); + } + } else { + this._snackBar.open('Unlock Failed (no file)', 'close', { + duration: 5000, + panelClass: 'error', + }); + } + } + + public hasExistingConfig() { + return ( + this.walletService.getSeeds().length > 0 || this.walletService.publicKey + ); + } + + async onFileSelected(file: File): Promise { + this.file = file; + if (this.file) { + const binaryVaultFile = await this.file.arrayBuffer(); + this.selectedFileIsVaultFile = + this.walletService.isVaultFile(binaryVaultFile); + } + } + + reset() { + window.location.reload(); + } + + getVaultName() { + if(this.walletService.getName()){ + return "'" + this.walletService.getName() + "'"; + } + return ""; + } +} diff --git a/src/app/public/import/import.component.html b/src/app/public/import/import.component.html new file mode 100644 index 0000000..02f5f07 --- /dev/null +++ b/src/app/public/import/import.component.html @@ -0,0 +1,76 @@ + +
+ + +
+
+

{{ t("importComponent.title") }}

+
+ {{ t("importComponent.message") }} +

+
+
+ + + + + {{ t("unlockComponent.form.password.error.required") }} + + + {{ t("unlockComponent.form.password.error.min") }} + + + {{ t("unlockComponent.form.password.error.wrong") }} + + + + +
+
+
+
+
+ + +
+
diff --git a/src/app/public/import/import.component.scss b/src/app/public/import/import.component.scss new file mode 100644 index 0000000..2918927 --- /dev/null +++ b/src/app/public/import/import.component.scss @@ -0,0 +1,8 @@ +form { + display: flex; + justify-content: space-evenly; + align-items: center; + flex-direction: column; + flex-wrap: wrap; + row-gap: 15px; +} \ No newline at end of file diff --git a/src/app/public/import/import.component.ts b/src/app/public/import/import.component.ts new file mode 100644 index 0000000..ef8e2bc --- /dev/null +++ b/src/app/public/import/import.component.ts @@ -0,0 +1,198 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { ChangeDetectorRef, Component, Injector, Renderer2 } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialog } from 'src/app/core/confirm-dialog/confirm-dialog.component'; +import { TranslocoService } from '@ngneat/transloco'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; +import { UpdaterService } from 'src/app/services/updater-service'; +import { Router } from '@angular/router'; + + +@Component({ + selector: 'qli-import-vault', + templateUrl: './import.component.html', + styleUrls: ['./import.component.scss'] +}) +export class ImportVaultComponent extends QubicDialogWrapper { + + public file: File | null = null; + public selectedConfigFile: File | null = null; + public newUser = false; + public pwdWrong = false; + public selectedFileIsVaultFile = false; + + importForm = this.fb.group({ + password: [null, [Validators.required, Validators.minLength(8)]], + }); + + dialogRef: DialogRef | null = null; + + constructor( + renderer: Renderer2, + themeService: ThemeService, + public walletService: WalletService, + public updaterService: UpdaterService, + private transloco: TranslocoService, + private cdr: ChangeDetectorRef, + private fb: FormBuilder, + private dialog: MatDialog, + private _snackBar: MatSnackBar, + private router: Router, + private injector: Injector) { + super(renderer, themeService); + this.dialogRef = injector.get(DialogRef, null) + this.newUser = this.walletService.getSeeds().length <= 0 && !this.walletService.publicKey; + } + + onPasswordChange() { + this.pwdWrong = false; + } + + private async importAndUnlock() { + if (this.selectedFileIsVaultFile) { + // one vault file + const binaryFileData = await this.file?.arrayBuffer(); + if (binaryFileData) { + const success = await this.walletService.importVault(binaryFileData, (this.importForm.controls.password.value)); + if (success) { + this.pwdWrong = false; + this.walletService.isWalletReady = true; + this.updaterService.loadCurrentBalance(true); + this.router.navigate(['/']); + } else { + this._snackBar.open("Import Failed (passord or file do not match)", "close", { + duration: 5000, + panelClass: "error" + }); + } + } else { + this._snackBar.open("Unlock Failed (no file)", "close", { + duration: 5000, + panelClass: "error" + }); + } + } else { + const binaryFileData = await this.selectedConfigFile?.arrayBuffer(); + if (binaryFileData) { + const enc = new TextDecoder("utf-8"); + const jsonData = enc.decode(binaryFileData); + if (jsonData) { + const config = JSON.parse(jsonData); + + // import configuration + if((await this.unlock())){ + // legacy format + await this.walletService.importConfig(config); + this.updaterService.loadCurrentBalance(true); + } + } else { + this._snackBar.open("Unlock Failed (no file)", "close", { + duration: 5000, + panelClass: "error" + }); + } + } + } + } + + public hasExistingConfig() { + return this.walletService.getSeeds().length > 0 || this.walletService.publicKey; + } + + async checkImportAndUnlock() { + if (this.hasExistingConfig()) { + const confirmDialo = this.dialog.open(ConfirmDialog, { + restoreFocus: false, data: { + message: this.transloco.translate("unlockComponent.overwriteVault") + } + }); + confirmDialo.afterClosed().subscribe(result => { + if (result) { + // start import + this.importAndUnlock(); + } + }) + } else { + this.importAndUnlock(); + } + } + + public async unlock(): Promise { + + if (!this.importForm.valid || !this.importForm.controls.password.value || !this.file) { + this.importForm.markAsTouched(); + this.importForm.controls.password.markAllAsTouched(); + return false; + } + + let unlockPromise: Promise | undefined; + + const binaryFileData = await this.file?.arrayBuffer(); + + if (this.selectedFileIsVaultFile) { + if (binaryFileData) { + unlockPromise = this.walletService.unlockVault(binaryFileData, (this.importForm.controls.password.value)); + } else { + this._snackBar.open("Unlock Failed (no file)", "close", { + duration: 5000, + panelClass: "error" + }); + } + } else { + // legacy + this.pwdWrong = true; + unlockPromise = this.walletService.unlock(binaryFileData, (this.importForm.controls.password.value)); + + } + + if (unlockPromise) { + await unlockPromise.then(r => { + if (r) { + this.pwdWrong = false; + this.walletService.isWalletReady = true; + this.updaterService.loadCurrentBalance(true); + this.router.navigate(['/']); + } else { + this._snackBar.open("Import Failed", "close", { + duration: 5000, + panelClass: "error" + }); + } + }).catch(r => { + this._snackBar.open("Import Failed (passord or file do not match)", "close", { + duration: 5000, + panelClass: "error" + }); + }); + return true; + } + + return false; + } + + onSubmit(event: any): void { + event.stopPropagation(); + event.preventDefault(); + this.unlock(); + } + + + async onFileSelected(file: File): Promise { + console.log("EV", file); + this.file = file; //event?.target.files[0]; + if (this.file) { + const binaryVaultFile = await this.file.arrayBuffer(); + this.selectedFileIsVaultFile = this.walletService.isVaultFile(binaryVaultFile); + } + } + + async onConfigFileSelected(file: File): Promise { + this.selectedConfigFile = file; + } + + +} diff --git a/src/app/public/unlock/unlock.component.html b/src/app/public/unlock/unlock.component.html new file mode 100644 index 0000000..ec7dd1c --- /dev/null +++ b/src/app/public/unlock/unlock.component.html @@ -0,0 +1,74 @@ + +
+ + +
+
+ +

{{ t("unlockComponent.title") }}

+ +
+ {{ t("unlockComponent.reasonMessage") }} +

+
+ + + + + + + + + {{ t("unlockComponent.form.password.error.required") }} + + + {{ t("unlockComponent.form.password.error.min") }} + + + {{ t("unlockComponent.form.password.error.wrong") }} + +
+
+
+
+ + + +
+ + +
diff --git a/src/app/public/unlock/unlock.component.scss b/src/app/public/unlock/unlock.component.scss new file mode 100644 index 0000000..f829a7b --- /dev/null +++ b/src/app/public/unlock/unlock.component.scss @@ -0,0 +1,11 @@ +form { + display: flex; + justify-content: space-evenly; + align-items: center; + flex-direction: column; + flex-wrap: wrap; + row-gap: 15px; +} +.file-input { + display: none; +} \ No newline at end of file diff --git a/src/app/public/unlock/unlock.component.ts b/src/app/public/unlock/unlock.component.ts new file mode 100644 index 0000000..6421116 --- /dev/null +++ b/src/app/public/unlock/unlock.component.ts @@ -0,0 +1,183 @@ +import { Dialog, DialogRef } from '@angular/cdk/dialog'; +import { + ChangeDetectorRef, + Component, + Injector, + Renderer2, +} from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialog } from 'src/app/core/confirm-dialog/confirm-dialog.component'; +import { TranslocoService } from '@ngneat/transloco'; +import { ThemeService } from 'src/app/services/theme.service'; +import { QubicDialogWrapper } from 'src/app/core/dialog-wrapper/dialog-wrapper'; +import { UpdaterService } from 'src/app/services/updater-service'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'qli-public-unlock', + templateUrl: './unlock.component.html', + styleUrls: ['./unlock.component.scss'], +}) +export class PublicUnLockComponent extends QubicDialogWrapper { + public file: File | null = null; + public pwdWrong = false; + public selectedFileIsVaultFile = false; + + importForm = this.fb.group({ + password: [null, [Validators.required, Validators.minLength(8)]], + }); + + dialogRef: DialogRef | null = null; + + constructor( + renderer: Renderer2, + themeService: ThemeService, + public walletService: WalletService, + public updaterService: UpdaterService, + private transloco: TranslocoService, + private cdr: ChangeDetectorRef, + private fb: FormBuilder, + private dialog: MatDialog, + private _snackBar: MatSnackBar, + private router: Router, + private injector: Injector + ) { + super(renderer, themeService); + this.dialogRef = injector.get(DialogRef, null); + } + + onPasswordChange() { + this.pwdWrong = false; + } + + public async unlock(): Promise { + if ( + !this.importForm.valid || + !this.importForm.controls.password.value || + !this.file + ) { + this.importForm.markAsTouched(); + this.importForm.controls.password.markAllAsTouched(); + return false; + } + + let unlockPromise: Promise | undefined; + + const binaryFileData = await this.file?.arrayBuffer(); + + if (this.selectedFileIsVaultFile) { + if (binaryFileData) { + unlockPromise = this.walletService.unlockVault( + binaryFileData, + this.importForm.controls.password.value + ); + } else { + this._snackBar.open('Unlock Failed (no file)', 'close', { + duration: 5000, + panelClass: 'error', + }); + } + } else { + // legacy + this.pwdWrong = true; + unlockPromise = this.walletService.unlock( + binaryFileData, + this.importForm.controls.password.value + ); + } + + if (unlockPromise) { + try { + const unlockResult = await unlockPromise; + if (unlockResult) { + this.pwdWrong = false; + + // test if the private and public key match + const seeds = this.walletService.getSeeds(); + let decryptedSeed = ''; + try { + decryptedSeed = await this.walletService.revealSeed( + seeds[0].publicId + ); + } catch (e) { + console.error(e); + } + + if (seeds && seeds.length > 0 && decryptedSeed == '') { + this._snackBar.open( + 'Unlock Failed: Private- and PublicKey mismatch', + 'close', + { + duration: 5000, + panelClass: 'error', + } + ); + this.walletService.lock(); + } else { + this.walletService.isWalletReady = true; + this.updaterService.loadCurrentBalance(true); + this.router.navigate(['/']); + } + } else { + this._snackBar.open('Unlock Failed', 'close', { + duration: 5000, + panelClass: 'error', + }); + } + } catch (r) { + console.error(r); + this._snackBar.open( + 'Unlock Failed (passord or file do not match)', + 'close', + { + duration: 5000, + panelClass: 'error', + } + ); + } + return true; + } + + return false; + } + + onSubmit(event: any): void { + event.stopPropagation(); + event.preventDefault(); + this.unlock(); + } + + async onFileSelected(file: File): Promise { + this.file = file; + if (this.file) { + const binaryVaultFile = await this.file.arrayBuffer(); + this.selectedFileIsVaultFile = + this.walletService.isVaultFile(binaryVaultFile); + } + } + + private confirmRedirect(route: string) { + const confirmDialo = this.dialog.open(ConfirmDialog, { + restoreFocus: false, + data: { + message: this.transloco.translate('unlockComponent.overwriteVault'), + }, + }); + confirmDialo.afterClosed().subscribe((result) => { + if (result) { + this.router.navigate([route]); + } + }); + } + + public importVault() { + this.confirmRedirect('./import'); + } + + public createNewVault() { + this.confirmRedirect('./create'); + } +} diff --git a/src/app/public/welcome/welcome.component.html b/src/app/public/welcome/welcome.component.html new file mode 100644 index 0000000..3b83bfe --- /dev/null +++ b/src/app/public/welcome/welcome.component.html @@ -0,0 +1,30 @@ + +
+
+
+ + +
+

+ {{ t("welcomeComponent.title") }} +

+ {{ t("welcomeComponent.welcomeMessage") }} +
+ + +
+
+
+
diff --git a/src/app/public/welcome/welcome.component.scss b/src/app/public/welcome/welcome.component.scss new file mode 100644 index 0000000..6350bee --- /dev/null +++ b/src/app/public/welcome/welcome.component.scss @@ -0,0 +1,12 @@ +.wallet-icon { + height: 100px; +} +.welcome-content { + max-width: 550px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + row-gap: 16px; +} \ No newline at end of file diff --git a/src/app/public/welcome/welcome.component.ts b/src/app/public/welcome/welcome.component.ts new file mode 100644 index 0000000..327f6a3 --- /dev/null +++ b/src/app/public/welcome/welcome.component.ts @@ -0,0 +1,71 @@ +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { FormBuilder, FormControl, Validators } from '@angular/forms'; +import { MatCheckbox, MatCheckboxChange } from '@angular/material/checkbox'; +import { MatDialog } from '@angular/material/dialog'; +import { WalletService } from '../../services/wallet.service'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { ApiService } from '../../services/api.service'; +import { Router, ActivatedRoute, ParamMap } from '@angular/router'; +import { ThemeService } from '../../services/theme.service'; + +@Component({ + selector: 'qli-welcome', + templateUrl: './welcome.component.html', + styleUrls: ['./welcome.component.scss'] +}) +export class WelcomeComponent implements OnInit { + + public currentTick = 0; + + autoTick: FormControl = new FormControl(true); + + transferForm = this.fb.group({ + sourceId: [], + destinationId: ["", [Validators.required, Validators.minLength(60), Validators.maxLength(60)]], + amount: [10000, [Validators.required, Validators.min(1)]], + tick: [0, [Validators.required]], + autoTick: this.autoTick + }); + + constructor(public themeService: ThemeService, private fb: FormBuilder, private route: ActivatedRoute, private changeDetectorRef: ChangeDetectorRef, private api: ApiService, private _snackBar: MatSnackBar, public walletService: WalletService, private dialog: MatDialog) + { + // this.tickFormControl.disable(); + this.getCurrentTick(); + } + + ngOnInit(): void { + this.route.queryParams.subscribe(params => { + if(params['publicId']){ + const publicId = params['publicId']; + this.transferForm.controls.sourceId.setValue(publicId); + } + }); + this.route.params.subscribe(params => { + if(params['receiverId']){ + const publicId = params['receiverId']; + this.transferForm.controls.destinationId.setValue(publicId); + } + if(params['amount']){ + const amount = params['amount']; + this.transferForm.controls.amount.setValue(amount); + } + }); + } + + getCurrentTick() { + this.api.getCurrentTick().subscribe(r => { + if(r && r.tick){ + this.currentTick = r.tick; + this.transferForm.controls.tick.setValue(r.tick + 10); + this.transferForm.controls.tick.addValidators(Validators.min(r.tick)); + } + }); + } + + init() { + this.transferForm.reset(); + this.getCurrentTick(); + } + +} diff --git a/src/app/services/api.model.ts b/src/app/services/api.model.ts new file mode 100644 index 0000000..b989da6 --- /dev/null +++ b/src/app/services/api.model.ts @@ -0,0 +1,154 @@ +export interface AuthResponse { + success?: boolean; + token?: string | null; + refreshToken?: string | null; + privileges?: Array | null; +} + +export interface CurrentTickResponse { + tick: number; + dateTime: Date; +} + + +export interface SubmitTransactionResponse { + id: string; + dateTime: Date; +} + +export interface SubmitTransactionRequest { + SignedTransaction: string +} + +export interface Transaction { + id: string; + sourceId: string; + destId: string; + amount: number; + status: string; + created: Date; + stored?: Date; + staged?: Date; + broadcasted?: Date; + confirmed?: Date; + statusUpdate?: Date; + targetTick: number; + isPending: boolean; + price?: number; // ipo bids + quantity?:number; // ipo bids + moneyFlow: boolean; +} + +export interface BalanceResponse { + computorIndex?: number; + isComputor: boolean; + publicId: string; + currentEstimatedAmount: number; + epochBaseAmount: number; + epochChanges: number; + baseDate: Date; + transactions: Transaction[] +} + +export interface NetworkBalance { + publicId: string; + amount: number; + tick: number; +} + +export interface MarketInformation { + supply: number; + price: number; + capitalization: number; + currency: string +} + +export interface BallotDto { + computorIndex?: number; + computorId?: string | null; + shortCode?: string | null; + vote?: number; +} + +export interface ProposalDto { + status: number; + url?: string | null; + computorIndex?: number; + shortCode?: string | null; + computorId: string; + ballots?: Array | null; + readonly resultSummary?: { [key: string]: Array; } | null; + readonly mostVotes?: number; + readonly sumOption1?: number; + readonly sumOption2?: number; + readonly sumOption3?: number; + readonly sumOption4?: number; + readonly sumOption5?: number; + readonly sumOption6?: number; + readonly sumOption7?: number; + readonly isPublished: boolean; + title?: string | null; + description?: string | null; + options?: string | null; + readonly hasVotes?: boolean; + published: Date | null; + publishedTick: number | null; + tickForPublish: number; +} + +export interface ProposalCreateRequest { + computorId: string | null; + title: string | null; + description: string | null; + option1: string | null; + option2: string | null; + option3?: string | null; + option4?: string | null; + option5?: string | null; + option6?: string | null; + option7?: string | null; +} +export interface ProposalCreateResponse { + url: string; + id: string; + computorIndex: number; + currentProtocol: number; +} + +export interface ContractDto { + id: string; + index: number; + name: string; + bidOverview: IpoBidOverview; +} + +export interface IpoBid { + publicKey: string; + computorId: string; + price: number; + positionIndex: number; +} + +export interface IpoBidOverview { + index: number; + tick: number; + bids: IpoBid[]; +} + +export interface PeerDto { + ipAddress: string; + currentTick: number; + lastChange: Date; +} +export interface QubicAsset { + publicId: string; + contractIndex: number; + assetName: string; + contractName: string; + ownedAmount: number; + possessedAmount: number; + tick: number; + reportingNodes: string[]; // New field to report source node + issuerIdentity: string; +} + diff --git a/src/app/services/api.service.ts b/src/app/services/api.service.ts new file mode 100644 index 0000000..6148211 --- /dev/null +++ b/src/app/services/api.service.ts @@ -0,0 +1,254 @@ +import { Injectable } from '@angular/core'; +import { AuthResponse, BalanceResponse, ContractDto, CurrentTickResponse, MarketInformation, NetworkBalance, PeerDto, ProposalCreateRequest, ProposalCreateResponse, ProposalDto, QubicAsset, SubmitTransactionRequest, SubmitTransactionResponse, Transaction } from './api.model'; +import { + HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec, HttpContext +} from '@angular/common/http'; +import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; +import { AuthInterceptor } from './auth-interceptor'; +import { environment } from '../../environments/environment'; +import { map, Observable, of } from 'rxjs'; +import { TokenService } from './token.service'; + +@Injectable({ + providedIn: 'root' +}) +export class ApiService { + + public currentProposals: BehaviorSubject = new BehaviorSubject([]); + public currentIpoContracts: BehaviorSubject = new BehaviorSubject([]); + public currentPeerList: BehaviorSubject = new BehaviorSubject([]); + public currentProtocol: BehaviorSubject = new BehaviorSubject(0); + private basePath = environment.apiUrl; + private authenticationActive = false; + + constructor(protected httpClient: HttpClient, private tokenSerice: TokenService, private authInterceptor: AuthInterceptor) { + this.reAuthenticate(); + } + + public reAuthenticate() { + if (this.authenticationActive) + return; + + this.authenticationActive = true; + // temp login for current use with public user + // login to qubic.li + this.login({ + username: 'guest@qubic.li', + password: 'guest13@Qubic.li' + }).subscribe(r => { + if (r && r.token) { + this.onAuthenticated(r.token); + } + this.authenticationActive = false; + }, (e) => { + this.authenticationActive = false; + }); + } + + private onAuthenticated(token: string) { + this.setToken(token); + this.getProtocol().subscribe(); + this.getPeerList().subscribe(); + } + + private setToken(token: string) { + this.tokenSerice.nextToken(token); + } + + public login(authRequest: { username: string, password: string }) { + let localVarPath = `/Auth/Login`; + return this.httpClient.request('post', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + body: authRequest, + responseType: 'json' + } + ); + } + + public getCurrentBalance(publicIds: string[]) { + let localVarPath = `/Wallet/CurrentBalance`; + return this.httpClient.request('post', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + body: publicIds, + responseType: 'json' + } + ); + } + + public getNetworkBalances(publicIds: string[]) { + let localVarPath = `/Wallet/NetworkBalances`; + return this.httpClient.request('post', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + body: publicIds, + responseType: 'json' + } + ); + } + + public getOwnedAssets(publicIds: string[]) { + let localVarPath = `/Wallet/Assets`; + return this.httpClient.request('post', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + body: publicIds, + responseType: 'json' + } + ); + } + + public getCurrentPrice() { + let localVarPath = `/Public/MarketInformation`; + return this.httpClient.request('get', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + responseType: 'json' + } + ); + } + + + + public getCurrentIpoBids(publicIds: string[]) { + let localVarPath = `/Wallet/CurrentIpoBids`; + return this.httpClient.request('post', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + body: publicIds, + responseType: 'json' + } + ); + } + + public submitTransaction(submitTransaction: SubmitTransactionRequest) { + let localVarPath = `/Public/SubmitTransaction`; + return this.httpClient.request('post', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + body: submitTransaction, + responseType: 'json' + } + ); + } + + public getCurrentTick() { + let localVarPath = `/Public/CurrentTick`; + return this.httpClient.request('get', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + responseType: 'json' + } + ); + } + + + public getProtocol() { + let localVarPath = `/Public/Protocol`; + return this.httpClient.request('get', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + responseType: 'json' + } + ).pipe(map((p) => { + this.currentProtocol.next(p); + return p; + })); + } + + public getProposals() { + let localVarPath = `/Voting/Proposal`; + return this.httpClient.request('get', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + responseType: 'json' + } + ).pipe(map((p) => { + this.currentProposals.next(p); + return p; + })); + } + + public getIpoContracts() { + let localVarPath = `/Wallet/IpoContracts`; + return this.httpClient.request('get', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + responseType: 'json' + } + ).pipe(map((p) => { + this.currentIpoContracts.next(p); + return p; + })); + } + + public submitProposalCreateRequest(proposal: ProposalCreateRequest) { + let localVarPath = `/Voting/Proposal`; + return this.httpClient.request('post', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + body: proposal, + responseType: 'json' + } + ); + } + + public submitProposalPublished(proposalId: string) { + let localVarPath = `/Voting/Proposal/` + proposalId + "/publish"; + return this.httpClient.request('post', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + responseType: 'json' + } + ); + } + + public getPeerList() { + let localVarPath = `/Public/Peers`; + return this.httpClient.request('get', `${this.basePath}${localVarPath}`, + { + context: new HttpContext(), + headers: { + "Content-Type": "application/json" + }, + responseType: 'json' + } + ).pipe(map((p) => { + this.currentPeerList.next(p); + return p; + })); + } + +} diff --git a/src/app/services/auth-interceptor.ts b/src/app/services/auth-interceptor.ts new file mode 100644 index 0000000..ac66153 --- /dev/null +++ b/src/app/services/auth-interceptor.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import { + HttpEvent, HttpInterceptor, HttpHandler, HttpRequest +} from '@angular/common/http'; + +import { Observable } from 'rxjs'; +import { ApiService } from './api.service'; +import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; +import { TokenService } from './token.service'; + +/** Pass untouched request through to the next request handler. */ +@Injectable() +export class AuthInterceptor implements HttpInterceptor { + + + + constructor(private tokenService: TokenService){ + } + + intercept(req: HttpRequest, next: HttpHandler): + Observable> { + const token = this.tokenService.getCurrentToken(); + const authReq = req.clone({ + headers: req.headers.set('Authorization', 'Bearer ' + token) + }); + return next.handle(authReq); + } +} \ No newline at end of file diff --git a/src/app/services/env.service.ts b/src/app/services/env.service.ts new file mode 100644 index 0000000..73d1dbb --- /dev/null +++ b/src/app/services/env.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class EnvironmentService { + + public isElectron = true; + + constructor() { + this.isElectron = this.detectIsElectron(); + } + + private detectIsElectron() { + // Renderer process + if (typeof window !== 'undefined' && typeof window.process === 'object' && (window).process.type === 'renderer') { + return true; + } + + // Main process + if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions['electron']) { + return true; + } + + // Detect the user agent when the `nodeIntegration` option is set to true + if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) { + return true; + } + + return false; +} +} diff --git a/src/app/services/qubic.service.ts b/src/app/services/qubic.service.ts new file mode 100644 index 0000000..24d9ab6 --- /dev/null +++ b/src/app/services/qubic.service.ts @@ -0,0 +1,190 @@ +import { Injectable } from '@angular/core'; +import { HashMap } from '@ngneat/transloco'; +import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; +import { QubicConnector } from 'qubic-ts-library/dist/QubicConnector'; +import { QubicPackageBuilder } from 'qubic-ts-library/dist/QubicPackageBuilder'; +import { PublicKey } from 'qubic-ts-library/dist/qubic-types/PublicKey'; +import { QubicEntity } from 'qubic-ts-library/dist/qubic-types/QubicEntity'; +import { QubicEntityRequest } from 'qubic-ts-library/dist/qubic-communication/QubicEntityRequest'; +import { QubicEntityResponse } from 'qubic-ts-library/dist/qubic-communication/QubicEntityResponse'; +import { QubicPackageType } from 'qubic-ts-library/dist/qubic-communication/QubicPackageType'; +import { QubicTickInfo } from 'qubic-ts-library/dist/qubic-types/QubicTickInfo'; +import { RequestResponseHeader } from 'qubic-ts-library/dist/qubic-communication/RequestResponseHeader'; +import { BalanceResponse, PeerDto, Transaction } from './api.model'; +import { ApiService } from './api.service'; +import { UpdaterService } from './updater-service'; +import { WalletService } from './wallet.service'; +import { VisibilityService } from './visibility.service'; + +/** + * Main Qubic Service which connects to the qubic network + */ +@Injectable({ + providedIn: 'root' +}) +export class QubicService { + + private tickInfoRefrshInterval = 2000; + private entityRefreshInterval = 30000; + private qon: QubicConnector = new QubicConnector(this.walletService.getRandomWebBridgeUrl()); + private peerList: PeerDto[] = []; + private currentTickInterval: any; + private entityInterval: any; + private useBridge = false; + public currentTick: BehaviorSubject = new BehaviorSubject(0); + public isConnected: BehaviorSubject = new BehaviorSubject(false); + private publicIds: PublicKey[] = []; + private desiredConnected: boolean = false; + private balanceCallbackQueue: ((entityResponse: QubicEntityResponse) => boolean)[] = []; + private bridgeConnected = false; + + constructor(private visibilityService: VisibilityService, private updateService: UpdaterService, private walletService: WalletService, private api: ApiService) { + walletService.onConfig.subscribe(c => { + this.useBridge = c.useBridge; + this.checkConnection(); + }); + api.currentPeerList.subscribe(s => { + this.peerList = s; + this.checkConnection(); + }); + + this.visibilityService.isActive().subscribe(isActive => { + if (!isActive) { + this.bridgeConnected = this.isConnected.getValue(); + this.disconnect(); + } else { + if (this.bridgeConnected) + this.connect(); + } + }); + } + + private checkConnection() { + if (!this.useBridge) { + this.qon.stop(); + } else { + if (!this.isConnected.getValue() && this.peerList.length > 0) { + this.connect(); + } + } + } + + private getPeer(): string { + return this.peerList[this.getRandomInt(0, this.peerList.length - 1)].ipAddress; + } + + private getRandomInt(min: number, max: number): number { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1) + min); + } + + private init(): void { + this.qon.onPackageReceived = (p) => { + if (p.header.getType() == QubicPackageType.RESPOND_CURRENT_TICK_INFO) { + const tickInfo = new QubicTickInfo().parse(p.payLoad); + if (tickInfo && this.currentTick.getValue() < tickInfo.getTick()) { + this.currentTick.next(tickInfo.getTick()); + this.updateService.currentTick.next(tickInfo.getTick()); + } + } else if (p.header.getType() == QubicPackageType.RESPOND_ENTITY) { + const entityResponse = new QubicEntityResponse().parse(p.payLoad); + if (entityResponse) + this.processEntityResponse(entityResponse); + } + }; + this.qon.onWsDisconnected = () => { + this.isConnected.next(false); + clearInterval(this.currentTickInterval); + clearInterval(this.entityInterval); + } + this.qon.onReady = () => { + this.qon.connect(this.getPeer()); + } + this.qon.onPeerConnected = () => { + this.isConnected.next(true); + this.requestEntities(); + this.currentTickInterval = setInterval(() => { + this.requestTickInfo(); + }, this.tickInfoRefrshInterval); + this.entityInterval = setInterval(() => { + this.requestEntities(); + }, this.entityRefreshInterval); + } + this.qon.onPeerDisconnected = () => { + this.isConnected.next(false); + clearInterval(this.currentTickInterval); + clearInterval(this.entityInterval); + this.reconnect(); + } + this.qon.start(); + } + + private requestTickInfo() { + if (this.isConnected) { + const header = new RequestResponseHeader(QubicPackageType.REQUEST_CURRENT_TICK_INFO) + header.randomizeDejaVu(); + this.qon.sendPackage(header.getPackageData()); + } + } + + public connect(): void { + if (!this.walletService.getSettings().useBridge) + return; + + this.desiredConnected = true; + this.reconnect(); + } + + public reconnect(): void { + if (this.isConnected) + this.qon.stop(); + if (this.desiredConnected) { + this.qon = new QubicConnector(this.walletService.getRandomWebBridgeUrl()); + this.init(); + } + } + + public disconnect(): void { + this.desiredConnected = false; + this.qon.stop(); + } + + private processEntityResponse(entityResponse: QubicEntityResponse) { + if (this.currentTick.getValue() <= entityResponse.getTick()) { + const pkey = this.publicIds.find(f => entityResponse.getEntity().getPublicKey().equals(f)); + if (pkey && pkey.getIdentityAsSring() !== undefined) + this.walletService.updateBalance(pkey.getIdentityAsSring()!, entityResponse.getEntity().getBalance(), entityResponse.getTick()); + } + this.balanceCallbackQueue = this.balanceCallbackQueue.filter(m => m && !m(entityResponse)); + } + + private requestEntities(): void { + if (this.isConnected) { + this.publicIds = []; + let i = 0; + this.walletService.getSeeds().forEach((s) => { + window.setTimeout(() => { + const pkey = new PublicKey(s.publicId); + this.publicIds.push(pkey); + this.updateBalance(pkey); + }, i * 200); + i++; + }); + } + } + + public updateBalance(pkey: PublicKey, callbackFn: undefined | ((entityResponse: QubicEntityResponse) => boolean) = undefined): boolean { + if (!this.isConnected) + return false; + const header = new RequestResponseHeader(QubicPackageType.REQUEST_ENTITY, pkey.getPackageSize()) + header.randomizeDejaVu(); + const builder = new QubicPackageBuilder(header.getSize()); + builder.add(header); + builder.add(new QubicEntityRequest(pkey)); + const data = builder.getData(); + if (callbackFn) + this.balanceCallbackQueue.push(callbackFn); + return this.qon.sendPackage(data); + } +} diff --git a/src/app/services/theme.service.ts b/src/app/services/theme.service.ts new file mode 100644 index 0000000..a69d985 --- /dev/null +++ b/src/app/services/theme.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class ThemeService { + + public isDarkTheme = false; + + constructor() { + var currentTheme = localStorage.getItem("theme"); + this.isDarkTheme = !currentTheme || currentTheme== 'dark'; + } + + public toggleTheme(): void { + this.isDarkTheme = !this.isDarkTheme; + localStorage.setItem("theme", this.isDarkTheme ? 'dark': 'light'); + window.location.reload(); + } +} diff --git a/src/app/services/token.service.ts b/src/app/services/token.service.ts new file mode 100644 index 0000000..c1f7216 --- /dev/null +++ b/src/app/services/token.service.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; + +@Injectable() +export class TokenService { + + public token = new BehaviorSubject(""); + + + constructor(){ + + const token = localStorage.getItem("token"); + if(token) + this.token.next(token); + } + + getCurrentToken(){ + return this.token.getValue(); + } + + nextToken(token: string){ + localStorage.setItem('token', token); + this.token.next(token); + } + + +} \ No newline at end of file diff --git a/src/app/services/transaction.service.ts b/src/app/services/transaction.service.ts new file mode 100644 index 0000000..cf86aab --- /dev/null +++ b/src/app/services/transaction.service.ts @@ -0,0 +1,160 @@ +import { Injectable } from '@angular/core'; +import { TranslocoService } from '@ngneat/transloco'; +import { QubicConnector } from 'qubic-ts-library/dist/QubicConnector'; +import { QubicPackageBuilder } from 'qubic-ts-library/dist/QubicPackageBuilder'; +import { QubicPackageType } from 'qubic-ts-library/dist/qubic-communication/QubicPackageType'; +import { RequestResponseHeader } from 'qubic-ts-library/dist/qubic-communication/RequestResponseHeader'; +import { ApiService } from './api.service'; +import { UpdaterService } from './updater-service'; +import { WalletService } from './wallet.service'; +import { VisibilityService } from './visibility.service'; +import { QubicTransaction } from 'qubic-ts-library/dist/qubic-types/QubicTransaction'; +import { lastValueFrom } from 'rxjs'; + + +/** + * Transaction Service to send transaction to the qubic network + */ +@Injectable({ + providedIn: 'root' +}) +export class TransactionService { + + constructor(private t: TranslocoService, private visibilityService: VisibilityService, private updateService: UpdaterService, private walletService: WalletService, private api: ApiService) { + + } + + /** + * sends the tx directly to the network (via websocket bridge) + * + * @param qtx the qubic transaction to publish to the network + * @param callbackFn callback function got's called when tx is published or any error happened + */ + private async directPush(qtx: QubicTransaction, callbackFn?: (result: ITransactionPublishResult) => void) { + + // create header + const header = new RequestResponseHeader(QubicPackageType.BROADCAST_TRANSACTION, qtx.getPackageSize()); + const builder = new QubicPackageBuilder(header.getSize()); + builder.add(header); + builder.add(qtx); + const transactionBinaryData = builder.getData(); + + let transactionSent = false; + + // create a dedicated connection to the network + const qubicConnector = new QubicConnector(this.walletService.getRandomWebBridgeUrl()); + + // event when websocket to bridge is established + qubicConnector.onReady = () => { + // choose random + qubicConnector.connect(this.api.currentPeerList.getValue()[0].ipAddress); + } + // event when we have connection to the qubic node/peer + qubicConnector.onPeerConnected = () => { + // send transaction + if (qubicConnector.sendPackage(transactionBinaryData)) { + transactionSent = true; + this.updateService.addQubicTransaction(qtx); + if (callbackFn) { + callbackFn({ + success: true + }); + } + } else { + if (callbackFn) { + callbackFn({ + success: false, + message: this.t.translate('paymentComponent.messages.failedToSend') + }); + } + } + qubicConnector.stop(); + } + qubicConnector.start(); // start publishing + // timeout for publishing a transaction. if there is no result in 2 seconds it has failed + window.setTimeout(() => { + if (!transactionSent && callbackFn) { + callbackFn({ + success: false, + message: this.t.translate('general.messages.timeoutTryAgain') + }); + } + }, 2000); + } + + + /** + * Publish a Qubic Transaction to the network + * + * @param qtx an already built/signed tx + * @returns status of publish + */ + public async publishTransaction(qtx: QubicTransaction): Promise { + + // todo: create proper error response/handling + // todo: implement more logical checks if the tx is valid (e.g. size, valid source/dest address) + + if (!qtx.getId()) { + console.error("Transaction must be built before publishing"); + return { + success: false, + message: "Transaction must be built before publishing" + }; + } + + if(!(await qtx.sourcePublicKey.verifyIdentity())){ + return { + success: false, + message: "Invalid Source Address" + }; + } + + if(!(await qtx.destinationPublicKey.verifyIdentity())){ + return { + success: false, + message: "Invalid Destination Address" + }; + } + + // if we are using bridged mode, the transaction is sent directly to the network and is not prxied through qli backend + if (this.walletService.getSettings().useBridge) { + return new Promise((resolve) => { + this.directPush(qtx, (r) => { + resolve(r); + }); + }) + } + else { + + const binaryData = qtx.getPackageData(); + + // submit transaction to the qli api/proxy + const apiResult = await lastValueFrom(this.api.submitTransaction({ SignedTransaction: this.walletService.arrayBufferToBase64(binaryData) })); + + if (apiResult && apiResult.id) { + // transaction was submitted successful + this.updateService.loadCurrentBalance(); // reload balance to get created tx into list of tx's + + return { + success: true + }; + } + else // failed to submit solution to qli api + { + + return { + success: true, + message: this.t.translate('paymentComponent.messages.failedToSend') + }; + } + + } + } + + +} + +interface ITransactionPublishResult { + success: boolean; + message?: string; +} \ No newline at end of file diff --git a/src/app/services/updater-service.ts b/src/app/services/updater-service.ts new file mode 100644 index 0000000..38c10b2 --- /dev/null +++ b/src/app/services/updater-service.ts @@ -0,0 +1,280 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; +import { QubicTransaction } from 'qubic-ts-library/dist/qubic-types/QubicTransaction'; +import { BalanceResponse, MarketInformation, NetworkBalance, QubicAsset, Transaction } from './api.model'; +import { ApiService } from './api.service'; +import { WalletService } from './wallet.service'; +import { VisibilityService } from './visibility.service'; + +@Injectable({ + providedIn: 'root' +}) +export class UpdaterService { + + public currentTick: BehaviorSubject = new BehaviorSubject(0); + public currentBalance: BehaviorSubject = new BehaviorSubject([]); + public currentPrice: BehaviorSubject = new BehaviorSubject({ supply: 0, price: 0, capitalization: 0, currency: 'USD' }); + public internalTransactions: BehaviorSubject = new BehaviorSubject([]); // used to store internal tx + public errorStatus: BehaviorSubject = new BehaviorSubject(""); + private tickLoading = false; + private balanceLoading = false; + private currentPriceLoading = false; + private networkBalanceLoading = false; + private isActive = true; + private lastAssetsLoaded: Date | undefined; + + + + constructor(private visibilityService: VisibilityService, private api: ApiService, private walletService: WalletService) { + this.init(); + } + + + private init(): void { + this.getCurrentTick(); + this.getCurrentBalance(); + this.getNetworkBalances(); + this.getAssets(); + this.getCurrentPrice(); + // every 30 seconds + setInterval(() => { + this.getCurrentTick(); + }, 30000); + // every minute + setInterval(() => { + this.getCurrentBalance(); + this.getNetworkBalances(); + this.getAssets(); + }, 60000); + // every hour + setInterval(() => { + this.getCurrentPrice(); + }, 60000 * 60); + + this.visibilityService.isActive().subscribe(s => { + if (!this.isActive && s) { + this.isActive = s; + this.forceUpdateCurrentTick(); + } else { + this.isActive = s; + } + }); + + } + + private getCurrentTick() { + if (this.tickLoading || !this.isActive) + return; + + this.tickLoading = true; + // todo: Use Websocket! + this.api.getCurrentTick().subscribe(r => { + if (r && r.tick) { + this.currentTick.next(r.tick); + } + this.tickLoading = false; + }, errorResponse => { + this.processError(errorResponse, false); + this.tickLoading = false; + }); + } + + public loadCurrentBalance(force = false) { + this.getCurrentBalance(force); + this.getNetworkBalances(undefined, undefined, force); + } + + + /** + * should load the current balances for the accounts + * @returns + */ + private getCurrentBalance(force = false) { + if (!force && (this.balanceLoading || !this.isActive)) + return; + + this.balanceLoading = true; + if (this.walletService.getSeeds().length > 0) { + // todo: Use Websocket! + this.api.getCurrentBalance(this.walletService.getSeeds().map(m => m.publicId)).subscribe(r => { + if (r) { + this.currentBalance.next(r); + this.addTransactions(r.flatMap((b) => b.transactions).filter(this.onlyUniqueTx).sort((a, b) => { return b.targetTick - a.targetTick })) + } + this.balanceLoading = false; + }, errorResponse => { + this.processError(errorResponse, false); + this.balanceLoading = false; + }); + } + } + + private onlyUniqueTx(value: Transaction, index: any, array: Transaction[]) { + return array.findIndex((f: Transaction) => f.id === value.id) == index; + } + + public forceLoadAssets(allbackFn: ((assets: QubicAsset[]) => void) | undefined = undefined) { + this.lastAssetsLoaded = undefined; + this.getAssets(undefined, allbackFn); + } + + public forceUpdateNetworkBalance(publicId: string, callbackFn: ((balances: NetworkBalance[]) => void) | undefined = undefined): void { + this.getNetworkBalances([publicId], callbackFn); + } + + /** + * load balances directly from network + * @returns + */ + private getNetworkBalances(publicIds: string[] | undefined = undefined, callbackFn: ((balances: NetworkBalance[]) => void) | undefined = undefined, force = false): void { + if (!force && (this.networkBalanceLoading || !this.isActive)) + return; + + if (!publicIds) + publicIds = this.walletService.getSeeds().map(m => m.publicId); + + this.networkBalanceLoading = true; + if (this.walletService.getSeeds().length > 0) { + // todo: Use Websocket! + this.api.getNetworkBalances(publicIds).subscribe(r => { + if (r) { + // update wallet + r.forEach((entry) => { + this.walletService.updateBalance(entry.publicId, entry.amount, entry.tick); + }); + if (callbackFn) + callbackFn(r); + } + this.networkBalanceLoading = false; + }, errorResponse => { + this.processError(errorResponse, false); + this.networkBalanceLoading = false; + }); + } + } + + // todo: put this in a helper class/file + private groupBy(arr: T[], fn: (item: T) => any) { + return arr.reduce>((prev, curr) => { + const groupKey = fn(curr); + const group = prev[groupKey] || []; + group.push(curr); + return { ...prev, [groupKey]: group }; + }, {}); + } + + /** + * load balances directly from network + * @returns + */ + private getAssets(publicIds: string[] | undefined = undefined, callbackFn: ((balances: QubicAsset[]) => void) | undefined = undefined): void { + if (!this.isActive || (this.lastAssetsLoaded && new Date().getTime() - this.lastAssetsLoaded.getTime() < (12 * 3600 * 1000))) // only update assets every 12h + return; + + if (!publicIds) + publicIds = this.walletService.getSeeds().map(m => m.publicId); + + if (publicIds.length > 0) { + // todo: Use Websocket! + this.api.getOwnedAssets(publicIds).subscribe((r: QubicAsset[]) => { + if (r) { + + // update wallet + const groupedAssets = this.groupBy(r, (a: QubicAsset) => a.publicId); + Object.keys(groupedAssets).forEach(k => { + this.walletService.updateAssets(k, groupedAssets[k]); + }); + + // remove old entries + this.walletService.removeOldAssets(r.reduce((p, c) => p !== 0 && p < c.tick ? p : c.tick, 0)); + + if (callbackFn) + callbackFn(r); + } + }, errorResponse => { + this.processError(errorResponse, false); + }); + } + } + + /** + * load balances directly from network + * @returns + */ + private getCurrentPrice(callbackFn: ((mi: MarketInformation) => void) | undefined = undefined): void { + if (!this.isActive || this.currentPriceLoading) + return; + + this.currentPriceLoading = true; + + // todo: Use Websocket! + this.api.getCurrentPrice().subscribe((r: MarketInformation) => { + if (r) { + this.currentPrice.next(r); + + if (callbackFn) + callbackFn(r); + + + } + this.currentPriceLoading = false; + }, errorResponse => { + this.processError(errorResponse, false); + this.currentPriceLoading = false; + }); + } + + + private processError(errObject: any, showToUser: boolean = true) { + if (errObject.status == 401) { + this.api.reAuthenticate(); + } else if (errObject.error.indexOf("Amount of Accounts must be between") >= 0) { + this.errorStatus.next(errObject.error); + } else if (errObject.statusText) { + if (showToUser) + this.errorStatus.next(errObject.error); + } + } + + public forceUpdateCurrentTick() { + this.getCurrentTick(); + } + + public addQubicTransaction(tx: QubicTransaction): void { + const newTx: Transaction = { + amount: Number(tx.amount.getNumber()), + status: "Broadcasted", + sourceId: tx.sourcePublicKey.getIdentityAsSring() ?? "", + destId: tx.destinationPublicKey.getIdentityAsSring() ?? "", + broadcasted: new Date(), + id: tx.getId(), + targetTick: tx.tick, + created: new Date(), + isPending: true, + moneyFlow: false + }; + this.addTransaction(newTx); + } + + public addTransaction(tx: Transaction): void { + const list = this.internalTransactions.getValue(); + if (!list.find(f => f.id.slice(0, 56) === tx.id.slice(0, 56))) { + list.unshift(tx); + this.internalTransactions.next(list); + } + } + + public addTransactions(txs: Transaction[]): void { + var list = this.internalTransactions.getValue(); + txs.forEach(tx => { + const existingTx = list.find(f => f.id.slice(0, 56) === tx.id.slice(0, 56)); + if (!existingTx) { + list.push(tx); + } else { + Object.assign(existingTx, tx); + } + }); + this.internalTransactions.next(list.sort((a, b) => { return b.targetTick - a.targetTick })); + } + +} diff --git a/src/app/services/visibility.service.ts b/src/app/services/visibility.service.ts new file mode 100644 index 0000000..0b73bd9 --- /dev/null +++ b/src/app/services/visibility.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; + +@Injectable() +export class VisibilityService { + + private _isActive = new BehaviorSubject(true); + + + constructor(){ + + document.addEventListener( + "visibilitychange" + , () => { + if (document.hidden) { + this._isActive.next(false); + }else{ + this._isActive.next(true); + } + } + ); + } + + public isActive() { + return this._isActive; + } + + public getCurrentIsActive(){ + return this._isActive.getValue(); + } +} \ No newline at end of file diff --git a/src/app/services/wallet.service.ts b/src/app/services/wallet.service.ts new file mode 100644 index 0000000..40b66df --- /dev/null +++ b/src/app/services/wallet.service.ts @@ -0,0 +1,823 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { bytes32ToString } from 'qubic-ts-library/dist//converter/converter'; +import { IConfig, IEncryptedVaultFile, IVaultFile } from '../model/config'; +import { IDecodedSeed, ISeed } from '../model/seed'; +import { ITx } from '../model/tx'; +import { QubicAsset } from './api.model'; +import { Router } from '@angular/router'; +import { OnReadOpts } from 'net'; + +@Injectable({ + providedIn: 'root', + useFactory: () => new WalletService() +}) +export class WalletService { + private runningConfiguration: IConfig; + + private configName = 'wallet-config'; + public privateKey: CryptoKey | null = null; + public publicKey: CryptoKey | null = null; + //public seeds: ISeed[] = []; + //public webBridges: string[] = []; + public txs: ITx[] = []; + public configError = false; + public erroredCOnfig: string = ''; + public shouldExportKey = true; + + + public isWalletReady = false; + + /** Events start */ + public onConfig: BehaviorSubject; + + /** Events stop */ + + /* Keep Track of Wallet Start Process */ + /* + * this promise is resolved as soon the config is loaded. + * this can be used e.g. in a guard + * example function: getLockUnlockRoute + */ + private _resolveConfigLoaded: (() => void) | null = null; + private _configLoadedSet: Promise = new Promise((resolve) => { + this._resolveConfigLoaded = resolve; + }); + + get configLoadedSet(): Promise { + return this._configLoadedSet; + } + + setConfigLoaded(): void { + if (this._resolveConfigLoaded) { + this._resolveConfigLoaded(); + // Optionally reset the promise for future use + this._resolveConfigLoaded = null; + } + } + /* Keep Track of Wallet Start Process */ + + private rsaAlg = { + name: 'RSA-OAEP', + modulusLength: 4096, + publicExponent: new Uint8Array([0x01, 0x00, 0x01]), + hash: { name: 'SHA-256' }, + }; + private aesAlg = { + name: 'AES-GCM', + length: 256, + iv: new Uint8Array(12).fill(0), + }; + private encAlg = { + name: 'RSA-OAEP', + }; + + constructor(private persistence = true) { + // create empty configuration + this.runningConfiguration = { + seeds: [], + webBridges: [], + tickAddition: 10, + useBridge: (window).require, + enableBeta: false + }; + this.onConfig = new BehaviorSubject(this.runningConfiguration); + this.load(); + } + + private load(): void { + this.loadConfigFromStorage(); + } + + private async loadConfigFromStorage() { + if(!this.persistence) + return; + + const jsonString = localStorage.getItem(this.configName); + if (jsonString) { + try { + const config = JSON.parse(jsonString); + await this.loadConfig(config); + } catch (e) { + this.configError = true; + this.erroredCOnfig = jsonString; + } + } + this.onConfig.next(this.runningConfiguration); + this.setConfigLoaded(); // resolve config loaded promise + } + + /** + * this will resolve as soon the walletservice configuration has loaded and the state is valid + * + * @param router the angular router + * @returns + */ + public async getLockUnlockRoute(router: Router) { + await this.configLoadedSet; // wait until config is loaded + if (!this.isWalletReady && !this.publicKey) { + if (this.getSeeds().length > 0) { + return router.parseUrl('/unlock'); + } else { + return router.parseUrl('/public'); + } + } + return true; + } + + private async loadConfig(config: IConfig) { + this.runningConfiguration = config; + + // backward compatibility + if (!this.runningConfiguration.tickAddition) + this.runningConfiguration.tickAddition = 20; + + // convert json key to internal cryptokey + if (this.runningConfiguration.publicKey) { + const k = await crypto.subtle.importKey( + 'jwk', + this.runningConfiguration.publicKey, + this.rsaAlg, + true, + ['encrypt'] + ); + this.publicKey = k; + this.isWalletReady = true; + } + + const tempFixedBridgeAddress = 'wss://webbridge.qubic.li'; + + if (!this.runningConfiguration.webBridges) + this.runningConfiguration.webBridges = []; + + // remove legacy entries + this.runningConfiguration.webBridges = + this.runningConfiguration.webBridges.filter( + (f) => f !== 'https://1.b.qubic.li' + ); + if (this.runningConfiguration.webBridges.length <= 0) + this.runningConfiguration.webBridges.push(tempFixedBridgeAddress); + + // todo: load web bridges dynamically + + + } + + public async createNewKeys() { + const keyPair = await this.generateKey(); + await this.setKeys(keyPair.publicKey, keyPair.privateKey); + } + + private async save(lock: boolean = false): Promise { + await this.saveConfig(lock); + } + + public getWebBridges(): string[] { + return [...this.runningConfiguration.webBridges]; + } + + public getRandomWebBridgeUrl(): string { + return this.runningConfiguration.webBridges[ + Math.floor(Math.random() * this.runningConfiguration.webBridges.length) + ]; + } + + public getSettings(): IConfig { + return { + seeds: [...this.runningConfiguration.seeds], + webBridges: [...this.runningConfiguration.webBridges], + useBridge: this.runningConfiguration.useBridge, + tickAddition: this.runningConfiguration.tickAddition, + enableBeta: this.runningConfiguration.enableBeta, + }; + } + + public getName() { + return this.runningConfiguration.name; + } + + public async updateName(name: string) { + this.runningConfiguration.name = name; + await this.saveConfig(false); + } + + public async updateConfig(config: any): Promise { + if (config.tickAddition !== undefined) + this.runningConfiguration.tickAddition = config.tickAddition; + if (config.enableBeta !== undefined) + this.runningConfiguration.enableBeta = config.enableBeta; + if (config.useBridge !== undefined) + this.runningConfiguration.useBridge = config.useBridge; + await this.saveConfig(false); + } + + public getSeeds(): ISeed[] { + const seeds = [...this.runningConfiguration.seeds]; + return seeds.sort((a, b) => { + const nameA = a.alias.toUpperCase(); // ignore upper and lowercase + const nameB = b.alias.toUpperCase(); // ignore upper and lowercase + if (nameA < nameB) { + return -1; + } + if (nameA > nameB) { + return 1; + } + + // names must be equal + return 0; + }); + } + public getSeed(publicId: string): ISeed | undefined { + return this.runningConfiguration.seeds.find((f) => f.publicId === publicId); + } + + public async revealSeed(publicId: string): Promise { + const seed = this.getSeed(publicId); + try { + const decryptedSeed = await this.decrypt( + this.privateKey!, + this.base64ToArrayBuffer(seed?.encryptedSeed!) + ); + return new TextDecoder().decode(decryptedSeed); + } catch (e) { + return Promise.reject(e); + } + } + + public async updateSeedAlias(publicId: string, alias: string) { + let seed = this.getSeed(publicId); + if (seed) { + seed.alias = alias; + await this.saveConfig(false); + } + } + + public async updateBalance( + publicId: string, + balance: number, + balanceTick: number + ) { + let seed = this.getSeed(publicId); + if (seed && (!seed.balanceTick || seed.balanceTick < balanceTick)) { + seed.balance = balance; + seed.balanceTick = balanceTick; + seed.lastUpdate = new Date(); + await this.saveConfig(false); + } + } + + + /** + * remove assets that are no longer updated + * @param referenceTick the tick from which on we consider an asset as old + */ + public async removeOldAssets(referenceTick: number) { + this.runningConfiguration.seeds.forEach(seed => { + seed.assets = seed.assets?.filter(f => f.tick >= referenceTick) + }); + await this.save(); + } + + public async updateAssets(publicId: string, assets: QubicAsset[]) { + let seed = this.getSeed(publicId); + + if (!seed) return; + + seed.assets = assets; + + // remove lost assets + seed.assets = seed?.assets?.filter((f) => + assets.find((q) => q.contractIndex == f.contractIndex) + ); + + await this.saveConfig(false); + } + + arrayBufferToBase64(buffer: ArrayBuffer) { + let binary = ''; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); + } + + base64ToArrayBuffer(base64: string) { + const binary_string = atob(base64); + const len = binary_string.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = binary_string.charCodeAt(i); + } + return bytes.buffer; + } + + public addSeed(seed: IDecodedSeed): Promise { + return this.encrypt(seed.seed).then((encryptedSeed) => { + const newSeed = { + encryptedSeed: btoa( + String.fromCharCode(...new Uint8Array(encryptedSeed)) + ), + alias: seed.alias, + publicId: seed.publicId, + }; + this.runningConfiguration.seeds.push(newSeed); + this.save(); + return newSeed; + }); + } + + deleteSeed(publicId: string) { + this.runningConfiguration.seeds = this.runningConfiguration.seeds.filter( + (f) => f.publicId !== publicId + ); + this.save(); + } + + private async generateKey() { + const key = await crypto.subtle.generateKey(this.rsaAlg, true, [ + 'encrypt', + 'decrypt', + ]); + return key; + } + + private async decrypt( + privateKey: CryptoKey, + message: ArrayBuffer + ): Promise { + const msg = await crypto.subtle.decrypt(this.encAlg, privateKey, message); + return msg; + } + + private async encrypt(message: string): Promise { + return crypto.subtle + .encrypt(this.encAlg, this.publicKey!, new TextEncoder().encode(message)) + .then((emessage) => { + return emessage; + }); + } + + private async saveConfig(lock: boolean) { + if(!this.persistence) + return; + if (lock) { + // when locking we don't want that the public key is saved. + this.runningConfiguration.publicKey = undefined; + localStorage.setItem( + this.configName, + JSON.stringify(this.runningConfiguration) + ); + } else { + try { + const jwk = await crypto.subtle.exportKey('jwk', this.publicKey!); + this.runningConfiguration.publicKey = jwk; + localStorage.setItem( + this.configName, + JSON.stringify(this.runningConfiguration) + ); + } catch (e) { + // ignore + } + } + this.onConfig.next(this.runningConfiguration); + } + + public async lock() { + await this.save(true); + this.privateKey = null; + this.publicKey = null; + } + + private async setKeys( + publicKey: CryptoKey, + privateKey: CryptoKey | null = null + ) { + this.publicKey = publicKey; + // also push the current publickey to the running configuration + const jwk = await crypto.subtle.exportKey('jwk', this.publicKey!); + this.runningConfiguration.publicKey = jwk; + + if (privateKey) this.privateKey = privateKey; + } + + public async importVault( + binaryVaultFile: ArrayBuffer /* encrypted vault file */, + password: string + ): Promise { + if (!this.isVaultFile(binaryVaultFile)) + return Promise.reject('INVALID VAULT FILE'); + + try { + // unlock + await this.unlockVault(binaryVaultFile, password); + + const vault = await this.convertBinaryVault(binaryVaultFile, password); + + // import configuration + await this.importConfig(vault.configuration); + + return true; + } catch (e) { + return false; + } + } + + /** + * converts the binary vault file to the internal vault file format (uploaded by the user) + * @param binaryVaultFile + * @param password + * @returns + */ + private async convertBinaryVault( + binaryVaultFile: ArrayBuffer /* encrypted vault file */, + password: string + ): Promise { + try { + const enc = new TextDecoder('utf-8'); + const encryptedVaultFile = JSON.parse( + enc.decode(binaryVaultFile) + ) as IEncryptedVaultFile; + const decryptedVaultFile = await this.decryptVault( + encryptedVaultFile, + password + ); + + return decryptedVaultFile; + } catch (error) { + return Promise.reject(error); + } + } + + /** + * unlocks the wallet from a vault file + * + * @param binaryVaultFile + * @param password + * @returns + */ + public async unlockVault( + binaryVaultFile: ArrayBuffer /* encrypted vault file */, + password: string + ): Promise { + if (!this.isVaultFile(binaryVaultFile)) + return Promise.reject('INVALID VAULT FILE'); + + try { + const decryptedVaultFile = await this.convertBinaryVault( + binaryVaultFile, + password + ); + const privKey = this.base64ToArrayBuffer(decryptedVaultFile.privateKey); + + const { privateKey, publicKey } = await this.importEncryptedPrivateKey( + privKey, + password + ); + + this.shouldExportKey = false; + await this.setKeys(publicKey, privateKey); + await this.save(); + + return true; + } catch (error) { + return Promise.reject(error); + } + } + + /** + * OBSOLETE legacy + * @param data + * @param password + * @returns + */ + public async unlock(data: ArrayBuffer, password: string): Promise { + const { privateKey, publicKey } = await this.importEncryptedPrivateKey(data, password); + this.shouldExportKey = false; + await this.setKeys(publicKey, privateKey); + await this.save(); + return true; + } + + async getPublicKey(privateKey: CryptoKey) { + const jwkPrivate = await crypto.subtle.exportKey('jwk', privateKey); + delete jwkPrivate.d; + jwkPrivate.key_ops = ['encrypt']; + return crypto.subtle.importKey('jwk', jwkPrivate, this.rsaAlg, true, [ + 'encrypt', + ]); + } + + async importEncryptedPrivateKey( + wrappedKey: ArrayBuffer, + password: string + ): Promise<{ privateKey: CryptoKey; publicKey: CryptoKey }> { + return this.importKey(password).then((pwKey: CryptoKey) => { + return this.deriveKey(pwKey).then((wrapKey: CryptoKey) => { + return crypto.subtle + .unwrapKey( + 'jwk', + wrappedKey, + wrapKey, + this.aesAlg, + this.rsaAlg, + true, + ['decrypt'] + ) + .then((privateKey) => { + return this.getPublicKey(privateKey).then((publicKey) => { + return { privateKey, publicKey }; + }); + }); + }); + }); + } + + private async importKey(password: string) { + const enc = new TextEncoder(); + const pw = enc.encode(password); + + return (crypto.subtle).importKey( + 'raw', + pw, + { name: 'PBKDF2' }, + false, + ['deriveBits', 'deriveKey'] + ); + } + + private async deriveKey(pwKey: CryptoKey) { + const salt = new Uint8Array(16).fill(0); + return crypto.subtle.deriveKey( + { + name: 'PBKDF2', + salt, + iterations: 100000, + hash: 'SHA-256', + }, + pwKey, + this.aesAlg, + true, + ['wrapKey', 'unwrapKey'] + ); + } + + private bytesToString(bytes: Uint8Array): string { + return new TextDecoder().decode(bytes); + } + + private stringToBytes(str: string): Uint8Array { + return new TextEncoder().encode(str); + } + + private bytesToBase64(arr: Uint8Array): string { + return btoa(Array.from(arr, (b) => String.fromCharCode(b)).join('')); + } + + private base64ToBytes(base64: string): Uint8Array { + return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)); + } + + private async getVaultFileKey(password: string, salt: any) { + const passwordBytes = this.stringToBytes(password); + + const initialKey = await crypto.subtle.importKey( + 'raw', + passwordBytes, + { name: 'PBKDF2' }, + false, + ['deriveKey'] + ); + return crypto.subtle.deriveKey( + { name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' }, + initialKey, + { name: 'AES-GCM', length: 256 }, + false, + ['encrypt', 'decrypt'] + ); + } + + private async encryptVault( + vaultFile: IVaultFile, + password: string + ): Promise { + const salt = crypto.getRandomValues(new Uint8Array(16)); + const key = await this.getVaultFileKey(password, salt); + + const iv = crypto.getRandomValues(new Uint8Array(12)); + const contentBytes = this.stringToBytes(JSON.stringify(vaultFile)); + + const cipher = new Uint8Array( + await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, contentBytes) + ); + + return { + salt: this.bytesToBase64(salt), + iv: this.bytesToBase64(iv), + cipher: this.bytesToBase64(cipher), + }; + } + + private async decryptVault( + encryptedData: IEncryptedVaultFile, + password: string + ): Promise { + const salt = this.base64ToBytes(encryptedData.salt); + + const key = await this.getVaultFileKey(password, salt); + + const iv = this.base64ToBytes(encryptedData.iv); + + const cipher = this.base64ToBytes(encryptedData.cipher); + + const contentBytes = new Uint8Array( + await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, cipher) + ); + const decryptedVault = this.bytesToString(contentBytes); + return JSON.parse(decryptedVault); + } + + /** + * checks if the provided file is of the new vault file format or not + */ + public isVaultFile(binaryFile: ArrayBuffer): boolean { + try { + const enc = new TextDecoder('utf-8'); + const jsonData = enc.decode(binaryFile); + const vaultFile = JSON.parse(jsonData) as IEncryptedVaultFile; + return ( + vaultFile !== undefined && + vaultFile.cipher !== undefined && + vaultFile.iv !== undefined && + vaultFile.salt !== undefined + ); + } catch (error) { + return false; + } + } + + public async exportVault(password: string): Promise { + if (!this.privateKey || !this.runningConfiguration.publicKey) + return Promise.reject('Private- or PublicKey not loaded'); + + const jsonKey = await this.createJsonKey(password); + if (jsonKey === null) { + return Promise.reject('JSONKEY IS NULL'); + } + + const vaultFile: IVaultFile = { + privateKey: this.arrayBufferToBase64(jsonKey), + publicKey: this.runningConfiguration.publicKey!, + configuration: this.prepareConfigExport(), + }; + + const encryptedVaultFile = await this.encryptVault(vaultFile, password); + + const fileData = new TextEncoder().encode( + JSON.stringify(encryptedVaultFile) + ); + const blob = new Blob([fileData], { type: 'application/octet-stream' }); + const name = this.runningConfiguration.name ?? 'qubic-config-addresses'; + this.downloadBlob(name + '.qubic-vault', blob); + this.shouldExportKey = false; + + await this.markSeedsAsSaved(); + + return true; + } + + private async createJsonKey(password: string): Promise { + if (!this.privateKey) return Promise.resolve(null); + + const pwKey = await this.importKey(password); + const wrapKey = await this.deriveKey(pwKey); + const jsonKey = await crypto.subtle.wrapKey( + 'jwk', + this.privateKey!, + wrapKey, + this.aesAlg + ); + + return jsonKey; + } + + /** + * OBSOLETE!!! don't use this anymore! + * @param password + * @returns + */ + public async exportKey(password: string) { + if (!this.privateKey) return Promise.resolve(); + + const jsonKey = await this.createJsonKey(password); + + if (jsonKey === null) { + console.error('KEY NULL'); + return Promise.resolve(); + } + + const blob = new Blob([jsonKey], { type: 'application/octet-stream' }); + this.downloadBlob('qubic-wallet.vault', blob); + this.shouldExportKey = false; + } + + public async importConfig(config: IConfig): Promise { + if (!config || config.seeds.length <= 0) return false; + + await this.loadConfig(config); + await this.saveConfig(false); + + return true; + } + + private prepareConfigExport(): IConfig { + const exportConfig: IConfig = { + name: this.runningConfiguration.name, + seeds: this.runningConfiguration.seeds.map((m) => { + const exportSeed: ISeed = {}; + Object.assign(exportSeed, m); + // reset states balance + exportSeed.balanceTick = 0; + exportSeed.lastUpdate = undefined; + exportSeed.isExported = true; + return exportSeed; + }), + webBridges: this.runningConfiguration.webBridges, + useBridge: this.runningConfiguration.useBridge, + tickAddition: this.runningConfiguration.tickAddition, + enableBeta: this.runningConfiguration.enableBeta + }; + return exportConfig; + } + + private async markSeedsAsSaved() { + // mark seeds as saved/exported + this.runningConfiguration.seeds.forEach((seed) => { + seed.isExported = true; + }); + await this.saveConfig(false); + } + + // OBSOLETE: LEGACY!!! + public async exportConfig(): Promise { + if ( + !this.runningConfiguration.seeds || + this.runningConfiguration.seeds.length <= 0 + ) + return false; + + const exportConfig = this.prepareConfigExport(); + + const data = new TextEncoder().encode(JSON.stringify(exportConfig)); + const blob = new Blob([data], { type: 'application/octet-stream' }); + const name = this.runningConfiguration.name ?? 'qubic-config-addresses'; + this.downloadBlob(name + '.qubic-wallet-config', blob); + + await this.markSeedsAsSaved(); + + return true; + } + + private downloadBlob(fileName: string, blob: Blob): void { + if ((window.navigator).msSaveOrOpenBlob) { + (window.navigator).msSaveBlob(blob, fileName); + } else { + const anchor = window.document.createElement('a'); + anchor.href = window.URL.createObjectURL(blob); + anchor.download = fileName; + document.body.appendChild(anchor); + anchor.click(); + document.body.removeChild(anchor); + window.URL.revokeObjectURL(anchor.href); + } + } + + public clearConfig() { + localStorage.removeItem(this.configName); + this.runningConfiguration.seeds = []; + this.publicKey = null; + this.isWalletReady = false; + } + + public resetConfig() { + this.clearConfig(); + location.reload(); + } + + private arrayBufferToString(buff: ArrayBuffer) { + return String.fromCharCode.apply( + null, + new Uint16Array(buff) as unknown as number[] + ); + } + + private stringToArrayBuffer(str: string) { + const buff = new ArrayBuffer(str.length * 2); // Because there are 2 bytes for each char. + const buffView = new Uint16Array(buff); + for (let i = 0, strLen = str.length; i < strLen; i++) { + buffView[i] = str.charCodeAt(i); + } + return buff; + } +} diff --git a/src/app/settings/account/account.component.html b/src/app/settings/account/account.component.html new file mode 100644 index 0000000..55de138 --- /dev/null +++ b/src/app/settings/account/account.component.html @@ -0,0 +1,5 @@ + +

Account Settings

+ +

{{ t("general.comingSoon")}}

+
\ No newline at end of file diff --git a/src/app/settings/account/account.component.scss b/src/app/settings/account/account.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/settings/account/account.component.ts b/src/app/settings/account/account.component.ts new file mode 100644 index 0000000..9d2bb51 --- /dev/null +++ b/src/app/settings/account/account.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-account', + templateUrl: './account.component.html', + styleUrls: ['./account.component.scss'] +}) +export class AccountComponent { + +} diff --git a/src/app/settings/export/export.component.html b/src/app/settings/export/export.component.html new file mode 100644 index 0000000..de878a7 --- /dev/null +++ b/src/app/settings/export/export.component.html @@ -0,0 +1,42 @@ + +
+

{{ t("settings.import.title") }} (legacy)

+ + +
+ check
+ {{ t("settings.import.doneMessage") }} +

+ {{ t("settings.import.goHomeLink") }} +
+
+ + +

+
+ {{ t("settings.import.seedsMessage", { amount: configToImport.seeds.length}) }}

+ +
+
+ {{ fileError }} +
+
+
+
+
+

{{ t("settings.export.title") }} (legacy)

+ + +
+ {{ t("settings.export.hint") }} +
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/src/app/settings/export/export.component.scss b/src/app/settings/export/export.component.scss new file mode 100644 index 0000000..7a6a483 --- /dev/null +++ b/src/app/settings/export/export.component.scss @@ -0,0 +1,21 @@ +.imexport { + max-width: 350px; + display: flex; + flex-direction: column; + column-gap: 10px; + row-gap: 20px; + justify-content: center; + align-items: center; + ngx-file-drop { + width: 95%; + } + .import-done { + mat-icon { + font-size: 30px; + } + } + .export { + text-align: center; + row-gap: 10px;; + } +} \ No newline at end of file diff --git a/src/app/settings/export/export.component.ts b/src/app/settings/export/export.component.ts new file mode 100644 index 0000000..5acaa59 --- /dev/null +++ b/src/app/settings/export/export.component.ts @@ -0,0 +1,98 @@ +import { Component } from '@angular/core'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { NgxFileDropEntry } from 'ngx-file-drop'; +import { IConfig } from '../../model/config'; +import { DeviceDetectorService } from 'ngx-device-detector'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialog } from 'src/app/core/confirm-dialog/confirm-dialog.component'; + +@Component({ + selector: 'app-export', + templateUrl: './export.component.html', + styleUrls: ['./export.component.scss'] +}) +export class ExportComponent { + + public fileError: string = ""; + public configToImport: IConfig | undefined; + public isMobile = true; + public importDone = false; + + constructor (private walletService: WalletService, public dialog: MatDialog, private _snackBar: MatSnackBar, private transloco: TranslocoService, private deviceService: DeviceDetectorService){ + } + + public import() { + if(!this.configToImport) + return; + const confirmDialog = this.dialog.open(ConfirmDialog, { restoreFocus: false }); + confirmDialog.afterClosed().subscribe(result => { + if (result) { + if(!this.walletService.importConfig(this.configToImport!)){ + this._snackBar.open(this.transloco.translate("settings.import.failed"), this.transloco.translate("general.close") , { + duration: 0, + panelClass: "error" + }); + }else { + this.importDone = true; + window.location.reload(); + } + } + }) + + + } + + public export() { + if(!this.walletService.exportConfig()){ + this._snackBar.open(this.transloco.translate("settings.export.noData"), this.transloco.translate("general.close") , { + duration: 0, + panelClass: "error" + }); + } + } + + public dropped(files: NgxFileDropEntry[]) { + if(files.length !== 1){ + this._snackBar.open(this.transloco.translate("settings.export.onlyOneFile"), this.transloco.translate("general.close") , { + duration: 0, + panelClass: "error" + }); + return; + } + //this.file = files[0]; + for (const droppedFile of files) { + + // Is it a file? + if (droppedFile.fileEntry.isFile) { + const fileEntry = droppedFile.fileEntry as FileSystemFileEntry; + fileEntry.file((file: File) => { + + // analyze file + file.arrayBuffer().then(b => { + const enc = new TextDecoder("utf-8"); + const jsonData = enc.decode(b); + if(jsonData){ + this.configToImport = JSON.parse(jsonData); + //todo: better type check + if(!this.configToImport || !this.configToImport.seeds){ + this.configToImport = undefined; + this._snackBar.open(this.transloco.translate("settings.import.invalidConfig"), this.transloco.translate("general.close"), { + duration: 5000, + panelClass: "error" + }); + } + } + }).catch(r => { + this._snackBar.open(this.transloco.translate("settings.import.wrongFile"), this.transloco.translate("general.close"), { + duration: 5000, + panelClass: "error" + }); + }); + + }); + } + } + } +} diff --git a/src/app/settings/general/general.component.html b/src/app/settings/general/general.component.html new file mode 100644 index 0000000..a6adfd3 --- /dev/null +++ b/src/app/settings/general/general.component.html @@ -0,0 +1,29 @@ + +
+ + +
+
+ {{ t("settings.general.tickAddition.placeholder") }} + + + + {{ t('settings.general.webBridge.placeholder') + }} + {{ t('settings.general.beta.placeholder') + }} +
+
+ +
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/app/settings/general/general.component.scss b/src/app/settings/general/general.component.scss new file mode 100644 index 0000000..55e4f9e --- /dev/null +++ b/src/app/settings/general/general.component.scss @@ -0,0 +1,10 @@ +.form-container { + display: flex; + flex-direction: column; + column-gap: 10px; + row-gap: 0px; +} + +mat-form-field{ + width:100%; +} \ No newline at end of file diff --git a/src/app/settings/general/general.component.ts b/src/app/settings/general/general.component.ts new file mode 100644 index 0000000..60154e0 --- /dev/null +++ b/src/app/settings/general/general.component.ts @@ -0,0 +1,52 @@ +import { Component } from '@angular/core'; +import { WalletService } from 'src/app/services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { NgxFileDropEntry } from 'ngx-file-drop'; +import { IConfig } from '../../model/config'; +import { DeviceDetectorService } from 'ngx-device-detector'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialog } from 'src/app/core/confirm-dialog/confirm-dialog.component'; +import { FormBuilder, FormControl, Validators } from '@angular/forms'; + +@Component({ + selector: 'app-settings-general', + templateUrl: './general.component.html', + styleUrls: ['./general.component.scss'] +}) +export class SettingsGeneralComponent { + + public fileError: string = ""; + public configToImport: IConfig | undefined; + public isMobile = false; + public importDone = false; + + form = this.fb.group({ + tickAddition: [10], + useBridge: [false], + enableBeta: [false], + }); + + constructor (private walletService: WalletService, private fb: FormBuilder, public dialog: MatDialog, private _snackBar: MatSnackBar, private transloco: TranslocoService, private deviceService: DeviceDetectorService){ + this.isMobile = deviceService.isMobile(); + + const settings = this.walletService.getSettings(); + + this.form.controls.tickAddition.setValue(settings.tickAddition); + this.form.controls.useBridge.setValue(settings.useBridge); + this.form.controls.enableBeta.setValue(settings.enableBeta); + } + + public getWebBridges(): string[]{ + return this.walletService.getWebBridges(); + } + + public onSubmit(){ + this.walletService.updateConfig({ + useBridge: this.form.controls.useBridge.value, + tickAddition: this.form.controls.tickAddition.value, + enableBeta: this.form.controls.enableBeta.value + }); + } + +} diff --git a/src/app/settings/settings.component.html b/src/app/settings/settings.component.html new file mode 100644 index 0000000..50aa438 --- /dev/null +++ b/src/app/settings/settings.component.html @@ -0,0 +1,8 @@ + +
+

{{ t("general.navigation.settings") }}

+ +
+ +
+
diff --git a/src/app/settings/settings.component.scss b/src/app/settings/settings.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/settings/settings.component.spec.ts b/src/app/settings/settings.component.spec.ts new file mode 100644 index 0000000..c39ac20 --- /dev/null +++ b/src/app/settings/settings.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SettingsComponent } from './settings.component'; + +describe('SettingsComponent', () => { + let component: SettingsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ SettingsComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SettingsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/settings/settings.component.ts b/src/app/settings/settings.component.ts new file mode 100644 index 0000000..1433a64 --- /dev/null +++ b/src/app/settings/settings.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-settings', + templateUrl: './settings.component.html', + styleUrls: ['./settings.component.scss'] +}) +export class SettingsComponent { + +} diff --git a/src/app/transloco-root.module.ts b/src/app/transloco-root.module.ts new file mode 100644 index 0000000..1bb4c85 --- /dev/null +++ b/src/app/transloco-root.module.ts @@ -0,0 +1,49 @@ +import { HttpClient } from '@angular/common/http'; +import { + TRANSLOCO_LOADER, + Translation, + TranslocoLoader, + TRANSLOCO_CONFIG, + translocoConfig, + TranslocoModule, + provideTransloco +} from '@ngneat/transloco'; +import { Injectable, isDevMode, NgModule } from '@angular/core'; +import { + provideTranslocoPersistLang, +} from '@ngneat/transloco-persist-lang'; + + +@Injectable({ providedIn: 'root' }) +export class TranslocoHttpLoader implements TranslocoLoader { + constructor(private http: HttpClient) {} + + getTranslation(lang: string) { + return this.http.get(`assets/i18n/${lang}.json`); + } +} + +@NgModule({ + exports: [ TranslocoModule ], + imports: [ + ], + providers: [ + provideTranslocoPersistLang({ + storage: { + useValue: localStorage, + }, + }), + provideTransloco({ + config: { + availableLangs: ['en', 'de', 'es', 'ru', 'nl','fr','pt'], + defaultLang: 'en', + // Remove this option if your application doesn't support changing language in runtime. + reRenderOnLangChange: true, + prodMode: !isDevMode(), + }, + loader: TranslocoHttpLoader + }), + { provide: TRANSLOCO_LOADER, useClass: TranslocoHttpLoader } + ] +}) +export class TranslocoRootModule {} diff --git a/src/app/voting/create/voting-create.component.html b/src/app/voting/create/voting-create.component.html new file mode 100644 index 0000000..1f3a98e --- /dev/null +++ b/src/app/voting/create/voting-create.component.html @@ -0,0 +1,287 @@ + +

{{ t("votingComponent.create.title") }}

+ +
+ {{ t("votingComponent.create.alreadyPublished") }} + +
+ +
+ + + + +
+
+
+ + {{ t("votingComponent.create.form.sourceSeed.label") }} + + + {{seed.alias}} | {{ seed.publicId }} + + + + {{ t("votingComponent.create.form.sourceSeed.error.required") }} + + + + {{ t("votingComponent.create.form.title.placeholder") }} + + {{ proposalForm.controls['title'].value?.length }} / + 50 + + {{ t("votingComponent.create.form.title.error.required") }} + + + {{ t("votingComponent.create.form.title.error.min") }} + + + {{ t("votingComponent.create.form.title.error.max") }} + + + + {{ t("votingComponent.create.form.description.placeholder") + }} + + {{ proposalForm.controls['description'].value?.length }} / + 500 + + {{ t("votingComponent.create.form.description.error.required") }} + + + {{ t("votingComponent.create.form.description.error.min") }} + + + {{ t("votingComponent.create.form.description.error.max") }} + + +
+
+
+
+ + {{ t("votingComponent.create.form.option.placeholder", {id: 1}) + }} + + {{ proposalForm.controls['option1'].value?.length }} / + 50 + + {{ t("votingComponent.create.form.option.error.required", {id: 1}) }} + + + {{ t("votingComponent.create.form.option.error.min") }} + + + {{ t("votingComponent.create.form.option.error.max") }} + + + {{ t("votingComponent.create.form.option.placeholder", {id: 2}) + }} + + {{ proposalForm.controls['option2'].value?.length }} / + 50 + + {{ t("votingComponent.create.form.option.error.required", {id: 2}) }} + + + {{ t("votingComponent.create.form.option.error.min") }} + + + {{ t("votingComponent.create.form.option.error.max") }} + + + + + {{ t("votingComponent.create.form.option.placeholder", {id: 3}) + }} + + {{ proposalForm.controls['option3'].value?.length }} / + 50 + + {{ t("votingComponent.create.form.option.error.required", {id: 3}) }} + + + {{ t("votingComponent.create.form.option.error.min") }} + + + {{ t("votingComponent.create.form.option.error.max") }} + + + + + {{ t("votingComponent.create.form.option.placeholder", {id: 4}) + }} + + {{ proposalForm.controls['option4'].value?.length }} / + 50 + + {{ t("votingComponent.create.form.option.error.required", {id: 4}) }} + + + {{ t("votingComponent.create.form.option.error.min") }} + + + {{ t("votingComponent.create.form.option.error.max") }} + + +
+
+ + + {{ t("votingComponent.create.form.option.placeholder", {id: 5}) + }} + + {{ proposalForm.controls['option5'].value?.length }} / + 50 + + {{ t("votingComponent.create.form.option.error.required", {id: 5}) }} + + + {{ t("votingComponent.create.form.option.error.min") }} + + + {{ t("votingComponent.create.form.option.error.max") }} + + + + + {{ t("votingComponent.create.form.option.placeholder", {id: 6}) + }} + + {{ proposalForm.controls['option6'].value?.length }} / + 50 + + {{ t("votingComponent.create.form.option.error.required", {id: 6}) }} + + + {{ t("votingComponent.create.form.option.error.min") }} + + + {{ t("votingComponent.create.form.option.error.max") }} + + + + + {{ t("votingComponent.create.form.option.placeholder", {id: 7}) + }} + + {{ proposalForm.controls['option7'].value?.length }} / + 50 + + {{ t("votingComponent.create.form.option.error.required", {id: 7}) }} + + + {{ t("votingComponent.create.form.option.error.min") }} + + + {{ t("votingComponent.create.form.option.error.max") }} + + +
+
+
+ + + +
+
+
+ +
+
+
+ + {{ t("votingComponent.create.form.operatorSeed.label") }} + + + {{seed.alias}} | {{ seed.publicId }} + + + + {{ t("votingComponent.create.form.sourceSeed.error.required") }} + + + +
+
+ + {{ t("votingComponent.create.form.computorIp.placeholder", {id: 7}) + }} + + + {{ t("votingComponent.create.form.computorIp.error.required", {id: 7}) }} + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+
+
+ +

{{ t('votingComponent.create.finishStep.success') }}

+
+ +
+
+
+
+ + + + + +
+
+
\ No newline at end of file diff --git a/src/app/voting/create/voting-create.component.scss b/src/app/voting/create/voting-create.component.scss new file mode 100644 index 0000000..56d0e10 --- /dev/null +++ b/src/app/voting/create/voting-create.component.scss @@ -0,0 +1,103 @@ +@import "../../../vars.scss"; + +.full-width { + width: 100%; +} + +.transfer-card { + min-width: 120px; + margin: 20px auto; +} + +.mat-radio-button { + display: block; + margin: 5px 0; +} + +.row { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} + +.col { + flex: 1; + margin-right: 10px; + margin-left: 10px; + margin-bottom: 15px; +} + +.padding button { + margin: 10px; +} +.tickOverwrite { + color: $mainColor +} + +.lds-grid { + display: inline-block; + position: relative; + width: 80px; + height: 80px; + } + .lds-grid div { + position: absolute; + width: 16px; + height: 16px; + border-radius: 50%; + background: #fff; + animation: lds-grid 1.2s linear infinite; + } + .lds-grid div:nth-child(1) { + top: 8px; + left: 8px; + animation-delay: 0s; + } + .lds-grid div:nth-child(2) { + top: 8px; + left: 32px; + animation-delay: -0.4s; + } + .lds-grid div:nth-child(3) { + top: 8px; + left: 56px; + animation-delay: -0.8s; + } + .lds-grid div:nth-child(4) { + top: 32px; + left: 8px; + animation-delay: -0.4s; + } + .lds-grid div:nth-child(5) { + top: 32px; + left: 32px; + animation-delay: -0.8s; + } + .lds-grid div:nth-child(6) { + top: 32px; + left: 56px; + animation-delay: -1.2s; + } + .lds-grid div:nth-child(7) { + top: 56px; + left: 8px; + animation-delay: -0.8s; + } + .lds-grid div:nth-child(8) { + top: 56px; + left: 32px; + animation-delay: -1.2s; + } + .lds-grid div:nth-child(9) { + top: 56px; + left: 56px; + animation-delay: -1.6s; + } + @keyframes lds-grid { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + } \ No newline at end of file diff --git a/src/app/voting/create/voting-create.component.ts b/src/app/voting/create/voting-create.component.ts new file mode 100644 index 0000000..a9fb543 --- /dev/null +++ b/src/app/voting/create/voting-create.component.ts @@ -0,0 +1,340 @@ +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { ApiService } from '../../services/api.service'; +import { WalletService } from '../../services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { BalanceResponse, ProposalCreateResponse, ProposalDto, Transaction } from '../../services/api.model'; +import { FormBuilder, FormControl, Validators } from '@angular/forms'; +import { UpdaterService } from '../../services/updater-service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { UnLockComponent } from 'src/app/lock/unlock/unlock.component'; +import { MatDialog } from '@angular/material/dialog'; +import { MatStepper } from '@angular/material/stepper'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; + +@Component({ + selector: 'app-voting-create', + templateUrl: './voting-create.component.html', + styleUrls: ['./voting-create.component.scss'] +}) +export class VotingCreateComponent implements OnInit, OnDestroy { + + @ViewChild('stepper') + public stepper!: MatStepper; + + public accountBalances: BalanceResponse[] = []; + public seedFilterFormControl: FormControl = new FormControl(); + public currentTick = 0; + public userServiceSubscription: Subscription | undefined; + public proposals: ProposalDto[] | undefined; + public proposal: ProposalDto | undefined; + private sub: any; + private triedToload = false; + public proposalToPublish: ProposalCreateResponse | undefined; + private selectedComputorId: string | null = null; + public isPublished = false; + private ws = new WebSocket('wss://webbridge.qubic.li/'); + private isWsConnected = false; + private dataPackageToSend: string | null = null; + public isPublishing = false; + public isPublishedFormControl = new FormControl('') + + + public proposalForm = this.fb.group({ + computorId: ['', [Validators.required]], + title: ["", [Validators.required,Validators.minLength(2), Validators.maxLength(100)]], + description: ["", [Validators.required,Validators.minLength(2)]], + option1: ["", [Validators.required,Validators.minLength(2), Validators.maxLength(50)]], + option2: ["", [Validators.required,Validators.minLength(2), Validators.maxLength(50)]], + option3: ["",[Validators.minLength(2),Validators.maxLength(50)]], + option4: ["",[Validators.minLength(2),Validators.maxLength(50)]], + option5: ["",[Validators.minLength(2),Validators.maxLength(50)]], + option6: ["",[Validators.minLength(2),Validators.maxLength(50)]], + option7: ["",[Validators.minLength(2),Validators.maxLength(50)]] + }); + + public publishForm = this.fb.group({ + operatorId: [localStorage.getItem("lastOperatorId"), [Validators.required]], + computorIp: [localStorage.getItem("lastComputorIp"), [Validators.required]] + }); + + constructor(private router: Router, private transloco: TranslocoService, private api: ApiService, public walletService: WalletService, private _snackBar: MatSnackBar, private us: UpdaterService + , private route: ActivatedRoute + , private fb: FormBuilder + , private dialog: MatDialog + ) { + this.api.currentProposals.subscribe(s => { + if (s.length == 0 && !this.triedToload) { + this.triedToload = true; + this.api.getProposals().subscribe(); + } else { + this.proposals = s; + this.init(); + } + }); + this.isPublishedFormControl.setErrors({ "required": true}); // fake state for last step + } + ngOnDestroy(): void { + if (this.userServiceSubscription) + this.userServiceSubscription.unsubscribe(); + if (this.sub) + this.sub.unsubscribe(); + if (this.ws) { + this.ws.close(); + } + } + + ngOnInit(): void { + if (this.hasSeeds()) { + this.userServiceSubscription = this.us.currentBalance.subscribe(response => { + this.accountBalances = response; + }, errorResponse => { + this._snackBar.open(errorResponse.error, this.transloco.translate("general.close"), { + duration: 0, + panelClass: "error" + }); + }); + } + + this.proposalForm.controls.computorId.valueChanges.subscribe(s => { + if (!this.selectedComputorId) + this.router.navigate(['/voting/create/', s]) + }); + + this.initializeBridge(); + } + + toBase64(u8: any): string { + return btoa(String.fromCharCode.apply(null, u8)); + } + + connectPeer(ipAddress: string): void { + this.ws.send(JSON.stringify( + { + command: 'connect', + host: ipAddress, + port: 21841 + } + )); + } + + + + onPeerConnect() { + // here we are connected to the qubic peer + if (this.dataPackageToSend != null) { + // send package to peer + this.ws.send(JSON.stringify( + { + command: 'sendb', + data: this.dataPackageToSend + } + )); + this.dataPackageToSend = null; // set to null to avoid multiple sends + } + } + + initializeBridge(): void { + this.ws.onmessage = (event: any): void => { + const jsonData = JSON.parse(event.data); + if (jsonData.message === 'connect done') { + this.onPeerConnect(); + } else if (jsonData.message === 'recv data') { + const byteArray = Uint8Array.from(atob(jsonData.data), c => c.charCodeAt(0)); + if (byteArray[3] === 4) { + // save proposal + if (this.proposalToPublish) { + this.api.submitProposalPublished(this.proposalToPublish.id).subscribe(s => { + this.isPublished = true; + this.isPublishedFormControl.reset(); + this.stepper.next(); + }); + } + } + } + }; + this.ws.onopen = (): void => { + this.isWsConnected = true; + }; + this.ws.onclose = (): void => { + this.isWsConnected = false; + }; + } + + init(): void { + this.sub = this.route.params.subscribe((params) => { + if (params['computorId']) { + this.selectedComputorId = params['computorId']; + this.proposal = this.proposals?.find(f => f.computorId == this.selectedComputorId); + this.proposalForm.controls.computorId.setValue(this.selectedComputorId); + if (this.proposal) { + this.proposalForm.controls.title.setValue((this.proposal.title)); + this.proposalForm.controls.description.setValue((this.proposal.description)); + const lines = this.proposal.options?.split("\n"); + let i = 1; + lines?.forEach(line => { + (this.proposalForm.controls)["option" + i].setValue(line); + i++; + }); + } + } + }); + } + + getDate() { + return new Date(); + } + + getTotalBalance(estimaed = false): number { + if (estimaed) + return this.accountBalances.reduce((p, c) => p + (c.currentEstimatedAmount), 0); + else + return this.accountBalances.reduce((p, c) => p + (c.epochBaseAmount), 0); + } + + hasSeeds() { + return this.walletService.getSeeds().length > 0; + } + + onlyUnique(value: Transaction, index: any, array: Transaction[]) { + return array.findIndex((f: Transaction) => f.id === value.id) == index; + } + + getTransactions(publicId: string | null = null): Transaction[] { + return this.accountBalances.flatMap((b) => b.transactions.filter(f => publicId == null || f.sourceId == publicId || f.destId == publicId)) + .filter(this.onlyUnique) + .sort((a, b) => { return (new Date(b.created)) - (new Date(a.created)) }); + } + + isOwnId(publicId: string): boolean { + return this.walletService.getSeeds().find(f => f.publicId == publicId) !== undefined; + } + + getSeedName(publicId: string): string { + var seed = this.walletService.getSeeds().find(f => f.publicId == publicId); + if (seed !== undefined) + return '(' + seed.alias + ')'; + else + return ''; + } + + getComputors() { + return this.walletService.getSeeds().filter(f => + this.accountBalances.find(q => q.isComputor && f.publicId == q.publicId) + && + !this.proposals?.find(q => q.computorId == f.publicId && q.isPublished) + ); + } + getSeeds() { + return this.walletService.getSeeds(); + } + + repeat(transaction: Transaction) { + this.router.navigate(['payment'], { + state: { + template: transaction + } + }); + } + + hasComputors() { + return this.accountBalances.find(f => f.isComputor); + } + + submitPublishForm() { + if (!this.publishForm.valid) { + this._snackBar.open("Invalid Form State", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + if (!this.walletService.privateKey) { + this._snackBar.open("Please unlock your Wallet first", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + if (!this.proposalToPublish?.url || this.proposalToPublish?.url.length! <= 0 || !this.proposalToPublish?.computorIndex) { + this._snackBar.open("Validateion Errors. Please Try Again Later", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + if (!this.isWsConnected) { + this._snackBar.open("Socked Connection Closed. Please Try Again Later", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + + // save ip and operator + localStorage.setItem("lastComputorIp", this.publishForm.controls.computorIp.value!); + localStorage.setItem("lastOperatorId", this.publishForm.controls.operatorId.value!); + + this.isPublishing = true; + // create package + this.walletService.revealSeed((this.publishForm.controls.operatorId.value)).then(operatorSeed => { + + new QubicHelper().createProposal(this.proposalToPublish?.currentProtocol!, this.proposalToPublish?.computorIndex!, operatorSeed, this.proposalToPublish?.url!).then(proposal => { + this.dataPackageToSend = this.toBase64(proposal); + // connect + this.connectPeer(this.publishForm.controls.computorIp.value!); + window.setTimeout(() => { + if (!this.isPublished) { + this.isPublishing = false; + this._snackBar.open("It Seems Liks There Was A Publishing Error. Please Try Again.", "close", { + duration: 10000, + panelClass: "error" + }); + } + }, 5000); + }); + }).catch(e => { + this._snackBar.open("We were not able to decrypt your seed. Did you use the correct private key??", "close", { + duration: 10000, + panelClass: "error" + }); + }); + } + + submitProposalForm() { + if (!this.proposalForm.valid) { + this._snackBar.open("Invalid Form State", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + + this.api.submitProposalCreateRequest({ + title: this.proposalForm.controls.title.value, + description: this.proposalForm.controls.description.value, + computorId: this.proposalForm.controls.computorId.value, + option1: this.proposalForm.controls.option1.value, + option2: this.proposalForm.controls.option2.value, + option3: this.proposalForm.controls.option3.value, + option4: this.proposalForm.controls.option4.value, + option5: this.proposalForm.controls.option5.value, + option6: this.proposalForm.controls.option6.value, + option7: this.proposalForm.controls.option7.value, + }).subscribe(s => { + this.proposalToPublish = s; + this.stepper.next(); + }, e => { + this._snackBar.open("Error. Please Try Again Later", "close", { + duration: 5000, + panelClass: "error" + }); + }); + } + + loadKey() { + const dialogRef = this.dialog.open(UnLockComponent, { restoreFocus: false }); + } + +} diff --git a/src/app/voting/participate/voting-participate.component.html b/src/app/voting/participate/voting-participate.component.html new file mode 100644 index 0000000..f57dc05 --- /dev/null +++ b/src/app/voting/participate/voting-participate.component.html @@ -0,0 +1,117 @@ + +

{{ t("votingComponent.participate.title") }}

+
+ + {{ t("votingComponent.participate.noComputorsText") }} + + + + +
+
+
+ {{ t("votingComponent.proposals.from") }}
+
+ {{p.computorId}} {{getSeedName(p.computorId)}} +
+ {{ t("votingComponent.proposals.url") }}
+ {{p.url}}

+
+ + + + Option 1 + Option 2 + Option 3 + Option 4 + Option 5 + Option 6 + Option 7 + + +
+
+
+ +
+
+ + + {{computorTree.name}} + + + +
    +
  • + +
    + {{subtask.name}} + done + + +
    +
    +
  • +
+
+
+
+
+
+
+ + {{ t("votingComponent.create.form.operatorSeed.label") }} + + + {{seed.alias}} | {{ seed.publicId }} + + + + {{ t("votingComponent.create.form.sourceSeed.error.required") }} + + +
+
+ + {{ t("votingComponent.create.form.computorIp.placeholder", {id: 7}) + }} + + + {{ t("votingComponent.create.form.computorIp.error.required", {id: 7}) }} + + +
+
+
+ {{getSelectedComputorCount()}} {{ t("votingComponent.participate.computorsSelected") }} +
+
+ + + + +
+
+
+
+
\ No newline at end of file diff --git a/src/app/voting/participate/voting-participate.component.scss b/src/app/voting/participate/voting-participate.component.scss new file mode 100644 index 0000000..160bdf7 --- /dev/null +++ b/src/app/voting/participate/voting-participate.component.scss @@ -0,0 +1,123 @@ +.flex { + display: flex; + flex-direction: row; + justify-content: center; + column-gap: 15px; + flex-wrap: wrap; + align-items: center; +} +.full-width { + width:100%; +} +.proposal { + text-align: center; +} + +.example-section { + margin: 12px 0; +} + +.example-margin { + margin: 0 12px; +} + +ul { + list-style-type: none; + margin-top: 4px; +} + +.row { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} + +.col { + flex: 1; + margin-right: 10px; + margin-left: 10px; + margin-bottom: 15px; + text-align: center; +} + +.lds-grid { + display: inline-block; + position: relative; + width: 80px; + height: 80px; +} + +.lds-grid div { + position: absolute; + width: 16px; + height: 16px; + border-radius: 50%; + background: #fff; + animation: lds-grid 1.2s linear infinite; +} + +.lds-grid div:nth-child(1) { + top: 8px; + left: 8px; + animation-delay: 0s; +} + +.lds-grid div:nth-child(2) { + top: 8px; + left: 32px; + animation-delay: -0.4s; +} + +.lds-grid div:nth-child(3) { + top: 8px; + left: 56px; + animation-delay: -0.8s; +} + +.lds-grid div:nth-child(4) { + top: 32px; + left: 8px; + animation-delay: -0.4s; +} + +.lds-grid div:nth-child(5) { + top: 32px; + left: 32px; + animation-delay: -0.8s; +} + +.lds-grid div:nth-child(6) { + top: 32px; + left: 56px; + animation-delay: -1.2s; +} + +.lds-grid div:nth-child(7) { + top: 56px; + left: 8px; + animation-delay: -0.8s; +} + +.lds-grid div:nth-child(8) { + top: 56px; + left: 32px; + animation-delay: -1.2s; +} + +.lds-grid div:nth-child(9) { + top: 56px; + left: 56px; + animation-delay: -1.6s; +} + +@keyframes lds-grid { + + 0%, + 100% { + opacity: 1; + } + + 50% { + opacity: 0.5; + } +} \ No newline at end of file diff --git a/src/app/voting/participate/voting-participate.component.ts b/src/app/voting/participate/voting-participate.component.ts new file mode 100644 index 0000000..06a9cec --- /dev/null +++ b/src/app/voting/participate/voting-participate.component.ts @@ -0,0 +1,458 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ApiService } from '../../services/api.service'; +import { WalletService } from '../../services/wallet.service'; +import { MatDialog } from '@angular/material/dialog'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { BalanceResponse, ProposalDto, Transaction } from '../../services/api.model'; +import { FormBuilder, FormControl, Validators } from '@angular/forms'; +import { UpdaterService } from '../../services/updater-service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { UnLockComponent } from 'src/app/lock/unlock/unlock.component'; + +export interface ComputorSelected { + name: string; + completed: boolean; + subComputors?: ComputorSelected[]; + published: boolean; + index?: number; + data?: string; + publishing: boolean; + publishStarted?: number; +} + +@Component({ + selector: 'app-voting-participate', + templateUrl: './voting-participate.component.html', + styleUrls: ['./voting-participate.component.scss'] +}) +export class VotingParticipateComponent implements OnInit, OnDestroy { + + public accountBalances: BalanceResponse[] = []; + public seedFilterFormControl: FormControl = new FormControl(); + public currentTick = 0; + public userServiceSubscription: Subscription | undefined; + public proposals: ProposalDto[] | undefined; + public proposal: ProposalDto | undefined; + private sub: any; + private triedToload = false; + public votes: number[] = new Array(676); + public computorTree: ComputorSelected = { + completed: false, + name: "All Computors", + subComputors: [], + published: false, + publishing: false + }; + public allComputors = false; + private publishInterval:any; + private globalPublishTimeout: number | undefined; + + private ws = new WebSocket('wss://webbridge.qubic.li/'); + private isWsConnected = false; + private peerConnected = false; + public isPublishing = false; + + public publishForm = this.fb.group({ + operatorId: [localStorage.getItem("lastOperatorId"), [Validators.required]], + computorIp: [localStorage.getItem("lastComputorIp"), [Validators.required]] + }); + + constructor(private router: Router, private transloco: TranslocoService, private api: ApiService, public walletService: WalletService, private _snackBar: MatSnackBar, private us: UpdaterService + , private route: ActivatedRoute + , private fb: FormBuilder + , private dialog: MatDialog + ) { + + for (let i = 0; i < 676; i++) { + this.votes[i] = 0; + } + } + ngOnDestroy(): void { + if (this.userServiceSubscription) + this.userServiceSubscription.unsubscribe(); + if (this.sub) + this.sub.unsubscribe(); + if (this.ws) { + this.ws.close(); + } + clearInterval(this.publishInterval); + } + + ngOnInit(): void { + this.api.currentProposals.subscribe(s => { + if (s.length == 0 && !this.triedToload) { + this.triedToload = true; + this.api.getProposals().subscribe(); + } else { + this.proposals = s; + if (this.hasSeeds()) { + this.userServiceSubscription = this.us.currentBalance.subscribe(response => { + this.accountBalances = response; + this.init(); + }, errorResponse => { + this._snackBar.open(errorResponse.error, this.transloco.translate("general.close"), { + duration: 0, + panelClass: "error" + }); + }); + } else { + this.init(); + } + } + }); + this.initializeBridge(); + } + init(): void { + if ((this.computorTree.subComputors?.length ?? 0) > 0) + return; + this.computorTree.subComputors = this.getComputors().map(m => { + return { + name: this.getSeedName(m.publicId), + completed: false, + published: false, + publishing: false, + index: this.accountBalances.find(q => m.publicId == q.publicId)?.computorIndex + } + }); + } + + toBase64(u8: any): string { + return btoa(String.fromCharCode.apply(null, u8)); + } + private connectedPeerAddress: string | undefined; + connectPeer(ipAddress: string): void { + this.ws.send(JSON.stringify( + { + command: 'connect', + host: ipAddress, + port: 21841 + } + )); + this.connectedPeerAddress = ipAddress; + } + disconnectPeer(): void { + if(this.connectedPeerAddress){ + this.ws.send(JSON.stringify( + { + command: 'disconnect', + host: this.connectedPeerAddress, + port: 21841 + } + )); + this.connectedPeerAddress = undefined; + this.peerConnected = false; + } + } + sendBallot() { + if(!this.isPublishing) + return; + + var comp = this.computorTree.subComputors?.find(f => f.completed && !f.published); + if(comp){ + if(!comp.data || comp.publishing && (comp.publishStarted! + (2*1000) < Date.now())){ + comp.publishing = false; + comp.publishStarted = undefined; + comp.data = undefined; + this.createPacket(comp); + }else { + comp.publishStarted = Date.now(); + comp.publishing = true; + this.ws.send(JSON.stringify( + { + command: 'sendb', + data: comp?.data + } + )); + } + + if(this.globalPublishTimeout && this.globalPublishTimeout < Date.now()){ + // global timeout reached. + this._snackBar.open("Global Timout Reached. Publish Has Been Stopped.", "close", { + duration: 10000, + panelClass: "error" + }); + this.cancelPublish(); + } + + }else { + this.isPublishing = false; + this._snackBar.open("Votes has been sent.", "close", { + duration: 5000, + panelClass: 'success' + }); + } + + } + + reconnectPeer() { + this.disconnectPeer(); // disconnect + // reset current publishing + this.computorTree.subComputors?.filter(f => f.publishing).forEach((comp) => { + comp.data = undefined; + comp.publishing = false; + comp.publishStarted = undefined; + }); + } + + cancelPublish(){ + clearInterval(this.publishInterval); + this.disconnectPeer(); + this.computorTree.subComputors?.forEach((comp) => { + comp.data = undefined; + comp.publishing = false; + comp.publishStarted = undefined; + }); + this.isPublishing = false; + } + createPacket(comp: ComputorSelected) { + this.walletService.revealSeed((this.publishForm.controls.operatorId.value)).then(operatorSeed => { + this.api.currentProtocol.subscribe(protocol => { + var computors = this.getSelectedComputors(); + if (computors?.length ?? 0 > 0) { + new QubicHelper().createBallotRequests(protocol, operatorSeed, [comp.index!], this.votes.map(m => +m)).then(ballots => { + if(ballots && ballots.length > 0){ + comp.data = this.toBase64(ballots[0]); + } + if(!this.peerConnected) + this.connectPeer(this.publishForm.controls.computorIp.value!); + }); + } + }); + + }).catch(e => { + this._snackBar.open("We were not able to decrypt your seed. Did you use the correct private key??", "close", { + duration: 10000, + panelClass: "error" + }); + }); + } + + onPeerConnect() { + this.peerConnected = true; + } + + initializeBridge(): void { + this.ws.onmessage = (event: any): void => { + const jsonData = JSON.parse(event.data); + if (jsonData.message === 'connect done') { + this.onPeerConnect(); + } else if (jsonData.message && jsonData.message.indexOf("ConnectionResetError") >= 0) + { + // when the peer closes the conection this error occures. if we are publishing we want to reconnect now + + this.reconnectPeer(); + + } + else if (jsonData.message === 'recv data') { + const byteArray = Uint8Array.from(atob(jsonData.data), c => c.charCodeAt(0)); + if (byteArray[3] === 4) { + const bytes = new Uint8Array([byteArray[17], byteArray[16]]); + const dataView = new DataView(bytes.buffer); + const value = dataView.getUint16(0, false); + const comp = this.computorTree.subComputors?.find(f => f.index == value); + if (comp){ + comp.completed = false; + comp.published = true; + comp.publishing = false; + } + + } + } + }; + this.ws.onopen = (): void => { + this.isWsConnected = true; + this.startInterval(); + }; + this.ws.onclose = (): void => { + this.isWsConnected = false; + this.peerConnected = false; + clearInterval(this.publishInterval); + }; + } + + startInterval() { + clearInterval(this.publishInterval); + this.publishInterval = setInterval(() => { + this.sendBallot(); + }, 500); + } + + getDate() { + return new Date(); + } + + getProposals() { + return this.proposals?.filter(f => f.status === 2 /* pending */); + } + + getTotalBalance(estimaed = false): number { + if (estimaed) + return this.accountBalances.reduce((p, c) => p + (c.currentEstimatedAmount), 0); + else + return this.accountBalances.reduce((p, c) => p + (c.epochBaseAmount), 0); + } + + hasSeeds() { + return this.walletService.getSeeds().length > 0; + } + + onlyUnique(value: Transaction, index: any, array: Transaction[]) { + return array.findIndex((f: Transaction) => f.id === value.id) == index; + } + + getTransactions(publicId: string | null = null): Transaction[] { + return this.accountBalances.flatMap((b) => b.transactions.filter(f => publicId == null || f.sourceId == publicId || f.destId == publicId)) + .filter(this.onlyUnique) + .sort((a, b) => { return (new Date(b.created)) - (new Date(a.created)) }); + } + + isOwnId(publicId: string): boolean { + return this.walletService.getSeeds().find(f => f.publicId == publicId) !== undefined; + } + + getSeedName(publicId: string): string { + var seed = this.walletService.getSeeds().find(f => f.publicId == publicId); + if (seed !== undefined) + return '(' + seed.alias + ')'; + else + return ''; + } + + getSeeds() { + return this.walletService.getSeeds(); + } + getComputors() { + return this.walletService.getSeeds().filter(f => + this.accountBalances.find(q => q.isComputor && f.publicId == q.publicId) + && + !this.proposals?.find(q => q.computorId == f.publicId && q.isPublished) + ); + } + getSelectedComputors() { + return this.computorTree.subComputors?.filter(f => f.completed) + } + getSelectedComputorCount(): number { + return this.getSelectedComputors()?.length ?? 0; + } + + repeat(transaction: Transaction) { + this.router.navigate(['payment'], { + state: { + template: transaction + } + }); + } + + hasComputors() { + return this.getComputors().length > 0; + } + + updateAllComplete() { + this.allComputors = this.computorTree.subComputors != null && this.computorTree.subComputors.every(t => t.completed); + } + + + someComplete(): boolean { + if (this.computorTree.subComputors == null) { + return false; + } + return this.computorTree.subComputors.filter(t => t.completed).length > 0 && !this.allComputors; + } + + setAll(completed: boolean) { + this.allComputors = completed; + if (this.computorTree.subComputors == null) { + return; + } + this.computorTree.subComputors.forEach(t => (t.completed = completed)); + } + + setComputor(comp: ComputorSelected, ev: any) { + comp.completed = ev; + } + + sendVotes() { + if (!this.publishForm.valid) { + this._snackBar.open("Invalid Form State", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + if (!this.walletService.privateKey) { + this._snackBar.open("Please unlock your Wallet first", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + if ((this.computorTree.subComputors?.filter(f => f.completed).length ?? 0) <= 0) { + this._snackBar.open("Must select at least one Computor.", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + if (!this.isWsConnected) { + this._snackBar.open("Socked Connection Closed. Please Try Again Later", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + + if(this.votes.filter(f => f !== 0).length <= 0){ + this._snackBar.open("At least one Vote should be selected.", "close", { + duration: 5000, + panelClass: "error" + }); + return; + } + // save ip and operator + localStorage.setItem("lastComputorIp", this.publishForm.controls.computorIp.value!); + localStorage.setItem("lastOperatorId", this.publishForm.controls.operatorId.value!); + + this.isPublishing = true; + + // var computors = this.getSelectedComputors(); + // if (computors?.length ?? 0 > 0) { + // computors!.forEach(comp => { + // this.createPacket(comp); + // }); + // } + this.globalPublishTimeout = Date.now() + (this.getSelectedComputors()?.length! * 10 * 1000); + this.startInterval(); + + + // create package + + // this.walletService.revealSeed((this.publishForm.controls.operatorId.value)).then(operatorSeed => { + // this.api.currentProtocol.subscribe(protocol => { + // var computors = this.getSelectedComputors(); + // if (computors?.length ?? 0 > 0) { + // new QubicHelper().createBallotRequests(protocol, operatorSeed, computors!.map(m => m.index!), this.votes.map(m => +m)).then(ballots => { + // ballots.forEach(ballot => { + // this.dataPackageToSend?.push(this.toBase64(ballot)); + // }); + // // connect + // this.connectPeer(this.publishForm.controls.computorIp.value!); + // }); + // } + // }); + + // }).catch(e => { + // this._snackBar.open("We were not able to decrypt your seed. Did you use the correct private key??", "close", { + // duration: 10000, + // panelClass: "error" + // }); + // }); + + } + + loadKey() { + const dialogRef = this.dialog.open(UnLockComponent, { restoreFocus: false }); + } +} diff --git a/src/app/voting/voting-status/voting-status.component.html b/src/app/voting/voting-status/voting-status.component.html new file mode 100644 index 0000000..5ca885a --- /dev/null +++ b/src/app/voting/voting-status/voting-status.component.html @@ -0,0 +1,51 @@ + +
+ + + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/src/app/voting/voting-status/voting-status.component.scss b/src/app/voting/voting-status/voting-status.component.scss new file mode 100644 index 0000000..3d9b96f --- /dev/null +++ b/src/app/voting/voting-status/voting-status.component.scss @@ -0,0 +1,3 @@ +.info { + +} \ No newline at end of file diff --git a/src/app/voting/voting-status/voting-status.component.ts b/src/app/voting/voting-status/voting-status.component.ts new file mode 100644 index 0000000..ba51577 --- /dev/null +++ b/src/app/voting/voting-status/voting-status.component.ts @@ -0,0 +1,29 @@ +import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; +import { FormBuilder, FormControl, Validators } from '@angular/forms'; +import { MatCheckbox, MatCheckboxChange } from '@angular/material/checkbox'; +import { MatDialog } from '@angular/material/dialog'; +import { QubicHelper } from 'qubic-ts-library/dist//qubicHelper'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { Router, ActivatedRoute, ParamMap } from '@angular/router'; +import { ProposalDto } from 'src/app/services/api.model'; + +@Component({ + selector: 'app-voting-status', + templateUrl: './voting-status.component.html', + styleUrls: ['./voting-status.component.scss'] +}) +export class VotingStatusComponent implements OnInit { + + @Input() + public proposal!: ProposalDto; + + constructor(private fb: FormBuilder, private route: ActivatedRoute, private changeDetectorRef: ChangeDetectorRef,private _snackBar: MatSnackBar, private dialog: MatDialog) + { + } + + ngOnInit(): void { + + } + + +} diff --git a/src/app/voting/voting.component.html b/src/app/voting/voting.component.html new file mode 100644 index 0000000..70d4a84 --- /dev/null +++ b/src/app/voting/voting.component.html @@ -0,0 +1,69 @@ + +
+

{{ t("votingComponent.title") }}

+
+ {{ t("general.loading") }} +
+
+
+ +
+
+ {{ t("votingComponent.proposals.noComputorHint") }} +
+
+

{{ t("votingComponent.proposals.title", {amount: proposals?.length}) }}

+ + + + {{ t("votingComponent.proposals.from") }}
+
+ {{p.shortCode}} | {{p.computorId}} {{getSeedName(p.computorId)}} +
+ {{ t("votingComponent.proposals.url") }}
+ {{p.url}}
+
+ Published:
{{p.published}} @ {{p.publishedTick}} +
+
+ Publish in progress... (in ~{{p.tickForPublish}} ticks) +
+
+ +

{{ t("votingComponent.proposals.votingResult") }}

+
+ {{ t("votingComponent.proposals.noVotes") }} +
+
+
+
+ Option {{s.key}}: {{s.value.length}} VotesVote +
+
+
+
+ + +
+
+
+
+
+ + +
+ {{ t("votingComponent.description") }} +
+
+
+
+
\ No newline at end of file diff --git a/src/app/voting/voting.component.scss b/src/app/voting/voting.component.scss new file mode 100644 index 0000000..7dd53f9 --- /dev/null +++ b/src/app/voting/voting.component.scss @@ -0,0 +1,6 @@ +.mostVotes{ + font-weight: bold; +} +.proposal-card { + margin-bottom: 10px; +} diff --git a/src/app/voting/voting.component.ts b/src/app/voting/voting.component.ts new file mode 100644 index 0000000..47c921c --- /dev/null +++ b/src/app/voting/voting.component.ts @@ -0,0 +1,101 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ApiService } from '../services/api.service'; +import { WalletService } from '../services/wallet.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslocoService } from '@ngneat/transloco'; +import { BalanceResponse, ProposalDto, Transaction } from '../services/api.model'; +import { FormControl } from '@angular/forms'; +import { UpdaterService } from '../services/updater-service'; +import { Router } from '@angular/router'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-voting', + templateUrl: './voting.component.html', + styleUrls: ['./voting.component.scss'] +}) +export class VotingComponent implements OnInit, OnDestroy { + + public accountBalances: BalanceResponse[] = []; + public seedFilterFormControl: FormControl = new FormControl(); + public currentTick = 0; + public userServiceSubscription: Subscription | undefined; + public proposals: ProposalDto[] | undefined; + + constructor(private router: Router, private transloco: TranslocoService, private api: ApiService, private walletService: WalletService, private _snackBar: MatSnackBar, private us: UpdaterService) { + + } + ngOnDestroy(): void { + if(this.userServiceSubscription) + this.userServiceSubscription.unsubscribe(); + } + + ngOnInit(): void { + if(this.hasSeeds()){ + this.userServiceSubscription = this.us.currentBalance.subscribe(response => { + this.accountBalances = response; + }, errorResponse => { + this._snackBar.open(errorResponse.error, this.transloco.translate("general.close"), { + duration: 0, + panelClass: "error" + }); + }); + } + this.api.getProposals().subscribe(s => { + this.proposals = s; + }); + } + + getDate() { + return new Date(); + } + + getTotalBalance(estimaed = false): number { + if(estimaed) + return this.accountBalances.reduce((p, c) => p + (c.currentEstimatedAmount), 0); + else + return this.accountBalances.reduce((p, c) => p + (c.epochBaseAmount), 0); + } + + hasSeeds() { + return this.walletService.getSeeds().length > 0; + } + + onlyUnique(value: Transaction, index:any, array:Transaction[]) { + return array.findIndex((f: Transaction) => f.id === value.id) == index; + } + + getTransactions(publicId: string | null = null): Transaction[] { + return this.accountBalances.flatMap((b) => b.transactions.filter(f => publicId == null || f.sourceId == publicId || f.destId == publicId)) + .filter(this.onlyUnique) + .sort((a,b) => { return (new Date(b.created)) - (new Date(a.created))}); + } + + isOwnId(publicId: string): boolean { + return this.walletService.getSeeds().find(f => f.publicId == publicId) !== undefined; + } + + getSeedName(publicId: string): string { + var seed = this.walletService.getSeeds().find(f => f.publicId == publicId); + if(seed !== undefined) + return '(' + seed.alias + ')'; + else + return ''; + } + + getSeeds() { + return this.walletService.getSeeds(); + } + + repeat(transaction: Transaction) { + this.router.navigate(['payment'], { + state: { + template: transaction + } + }); + } + + hasComputors() { + return this.accountBalances.find(f => f.isComputor); + } +} diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/fonts/PPTelegraf-Bold.ttf b/src/assets/fonts/PPTelegraf-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..eb92888a5d508dc8fdd86aa836ef7eff73836bca GIT binary patch literal 68864 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 Bosa+k literal 0 HcmV?d00001 diff --git a/src/assets/fonts/PPTelegraf-Light.ttf b/src/assets/fonts/PPTelegraf-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..719bd28a26b307f898e8ff93422b1e54cbe64657 GIT binary patch literal 66584 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 YwflN6c@x>cp{5BZC_69Q7LC>a0}xRbSpWb4 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/PPTelegraf-Medium.ttf b/src/assets/fonts/PPTelegraf-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..704e8d378aaa8916fec4271c0bb67914f05db789 GIT binary patch literal 65780 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/PPTelegraf-Regular.ttf b/src/assets/fonts/PPTelegraf-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..841df2a42a9787e7c5e664417d5dfdf2bfe54645 GIT binary patch literal 66984 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 SCUSm5PouACt2IMPORTANT!
This 55-Chars are your Qubic Private Key (Seed)!
Save/store this seed at secure location.
You may lose your funds if you do not have your seed(s) in backup!

More info on this topic:
https://unchained.com/blog/how-to-store-bitcoin-seed-phrase-backups ", + "form": { + "alias": { + "placeholder": "Choose an own name for your address in order to better refer to it.", + "error": { + "required": "Name required", + "min": "Name must have a minimum of 3 characters", + "max": "Name must have a maximum of 50 characters", + "regex": "Can only contain {{regex}}" + } + }, + "seed": { + "placeholder": "55-char Seed", + "error": { + "required": "An 55-char seed is required.", + "min": "The 55-char seed must exactly consist of 55 lower case characters", + "max": "The 55-char seed must exactly consist of 55 lower case characters", + "regex": "Can only contain a-zA-Z0-9_-" + }, + "generateSeed": "Randomly generate an 55-char seed." + }, + "watchOnlyAddress": { + "title": "Watch-Only-Address", + "placeholder": "60-char public-key", + "error": { + "required": "An 60-char public-key is required.", + "min": "The 60-char public-key must exactly consist of 60 upper case characters", + "max": "The 60-char public-key must exactly consist of 60 upper case characters", + "regex": "Can only contain A-Z" + } + }, + "error": { + "text": "Please check the form.", + "close": "close" + } + }, + "publicIdMessage": "Your address id is:", + "privateKeyWarning": "Caution! Your Vault file is not loaded. Please make sure you have it safely stored.", + "buttons": { + "cancel": "Cancel", + "create": "Create address", + "save": "Save address" + } + }, + "seedOverviewComponent": { + "title": "Addresses", + "isTable": "Show table", + "addSeedButton": "Add Address", + "importButton": "Import", + "exportButton": "Export", + "search.label": "Search", + "table": { + "alias": "Address Name", + "publicId": "Address ID", + "balance": "Balance", + "epochChanges": "Epoch Changes", + "noData": "No data matching the filter \"{{q}}\"", + "actions": { + "title": "Actions", + "revealSeed": "Reveal 55-char seed", + "assets": "Show Owned Assets", + "makePayment": "Make a payment", + "receivePayment": "Generate a QR Code to receive a payment.", + "editSeed": "Edit address", + "deleteSeed": "Delete address", + "refreshBalance": "Refresh Balance from Network" + } + }, + "hasPendingTransaction": "Transactions pending", + "marketPrice": "Price", + "marketSupply": "Supply", + "marketCap": "Marketcap", + "marketCurrency": "$" + }, + "dashboard": { + "title": "Dashboard", + "balance": "Vault balance", + "currency": "Qu", + "totalBalance": "Your Total Balance" + }, + "unlockComponent": { + "title": "Unlock Vault", + "title.new": "Create Vault", + "welcomeMessage": "Welcome to the Qubic Wallet.\nTo use this Wallet you must create a Vault file. This will contain your public/private key which afterwards is used to encrypt/decrypt your data.", + "reasonMessage": "To unlock your Vault, your Vault or wallet unlock file is needed. This file is automatically deleted once this page is reloaded or closed.", + "choosePrivateKeyFile": "Select Vault File", + "chooseConfigFile": "Select Config file", + "overwriteVault": "It looks like there is already some data saved in this Browser. Do you really want to overwrite it?", + "form": { + "file.error.required": "Vault/Wallet unlock file required", + "password.error.required": "Vault password required", + "password.error.min": "Your password must have a minimum of 8 characters.", + "password.error.wrong": "Your password is incorrect.", + "configFile": { + "error": { + "required": "Config file required" + } + } + }, + "buttons": { + "cancel": "Cancel", + "generateKey": "Create Vault", + "importAndUnlock": "Import Vault and Unlock", + "unlock": "Unlock Vault", + "existingUser": "I already have a Wallet", + "newUser": "Create Vault", + "closeWallet": "Close Wallet", + "importVault": "Import Vault" + }, + "welcomeHintMessage": "After you have downloaded your Vault file. You need to select the downloaded file and enter your password again. This will unlock your wallet." + }, + "lockIconComponent": { + "lock": "Lock Vault", + "unlock": "Unlock Vault" + }, + "lockComponent": { + "title": "Close Vault?", + "forceDownload": { + "title": "Download Vault File", + "reason": "When you lock your Wallet your loaded Vault file is automatically deleted. Without this Vault file no transactions can be made. Please be aware your Vault file is safely stored. Export it again in case of any doubt...", + "buttons": { + "allOk": "I have my unlock file, thanks" + } + }, + "reason": "It is paramount to safely store your Vault file. Please choose a strong password you won't forget and then click on \"save\".", + "warning": "I confirm that I have saved my Vault file.", + "password.placeholder": "Password", + "password.required": "Password required", + "password.min": "Password must have a minimum of 8 characters.", + "buttons": { + "savePrivateKey": "Save Vault file", + "closeWallet": "Lock Vault", + "exportAndCloseWallet": "Export Vault file and Lock Wallet", + "enableExport": "Export Vault File", + "cancel": "Cancel" + } + }, + "paymentComponent": { + "title": "Send Qubic Units (qus)", + "messages": { + "pleaseUnlock": "Please unlock your Wallet first", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Your transaction could not be sent. Please try again later.", + "failedToDecrypt": "We were not able to decrypt your seed. Did you use the correct unlock file (private key)??", + "failedValidation": "We had validation errors. Please check the form." + }, + "form": { + "sourceSeed": { + "label": "Address from which qus are to be sent", + "error": { + "required": "Sender address is required" + } + }, + "receiver": { + "placeholder": "Address ID of the receiver", + "hint": "60 uppercase characters", + "chooseOwnSeed": "Choose an own Address ID", + "error": { + "required": "Address ID is required", + "length": "A Qubic address ID consists of 60 uppercase letters." + } + }, + "amount": { + "placeholder": "Amount in Qubic Unis (qus)", + "max.tooltip": "Set to maximum available amount on this Seed", + "error": { + "required": "Amount is required", + "min": "Amount must be a minimum of 1" + } + }, + "tick": { + "placeholder": "Execution Tick", + "customize.tooltip": "Toggle to set custom Execution Tick", + "error": { + "required": "Tick is required", + "min": "Tick must be a minimum of {{currentTick}}" + } + } + }, + "buttons": { + "send": "Perform transaction", + "reset": "Reset", + "loadPrivateKey": "Load Vault file" + } + }, + "balanceComponent": { + "title": "Balance", + "createSeedHint": "Please create first a Seed", + "overview": { + "title": "Overview", + "totalWalletValue": "Fixed Wallet Value", + "estimatedWalletValue": "Estimated Wallet Value", + "baseDate": "per" + }, + "transactions": { + "title": "Transactions in current Epoch", + "verificationAlert": "Preview data could not be verified", + "noTransactions": "No Transactions found", + "send.tooltip": "Outgoing Transfer", + "exchange.tooltip": "Internal Transfer", + "explorer.tooltip": "Show Transfer in Explorer", + "receive.tooltip": "Incoming Transfer", + "status.pending.tooltip": "Pending", + "status.executed.tooltip": "Executed", + "status.dismissed.tooltip": "Dismissed", + "status.unknown.tooltip": "Unknown", + "status.confirmed.tooltip": "Staged", + "filter.seed.label": "Filter by Seed" + }, + "repeatTransaction": "Repeat Transaction" + }, + "settings": { + "general": { + "title": "Web Bridge", + "tickAddition.placeholder": "Number of Ticks added to the current tick to send a new transaction", + "webBridge.placeholder": "Enable the Web Bridge (Direct Connection to the QUBIC Network)", + "button.save": "Save Settings", + "beta": { + "placeholder": "Enable Beta Features" + } + }, + "import": { + "title": "Import Settings", + "doneMessage": "Import Successful", + "dropMessage": "Drop your address config file to import here", + "buttons.import": "Import address config file", + "seedsMessage": "You are about to import {{amount}} seeds.", + "goHomeLink": "Show imported Seeds" + }, + "export": { + "title": "Export Settings", + "hint": "Press the below button to download your current address config file. It contains your encrypted seeds. You also should have saved your unlock file (private key).", + "buttons.export": "Export/Save Config File" + } + }, + "votingComponent": { + "title": "Qubic Computor Voting", + "description": "The Qubic computor voting is used to reach a consensus on topics to be decided regarding the entire network. This can include accepting smart contracts or making other protocol decisions. Only computors are allowed to participate.", + "proposals": { + "editButton": "Edit", + "createButton": "Create Proposal", + "voteButton": "Vote", + "title": "{{amount}} Current Proposals", + "noComputorHint": "You don't have registered any Computor. If you want to propose anything, you need to have at least one Computor Seed.", + "votingResult": "Voting Result", + "noVotes": "no votes", + "from": "From:", + "url": "Proposal URL:" + }, + "participate": { + "title": "Participate", + "cancelButton": "Cancel", + "sendVotesButton": "Send Votes", + "notConfirmedMessage": "This Proposal is not yet confirmed by the Qubic Network. Please wait to vote.", + "noComputorsText": "You do not have Computors or your Computors already have created a proposal.", + "computorsSelected": "Computors selected" + }, + "create": { + "title": "Create Proposal", + "cancelButton": "Cancel", + "sendVotesButton": "Send Proposal", + "alreadyPublished": "This Computor has already a published Proposal. Only one is allowed per Epoch", + "buttons": { + "create": "Create Proposal", + "publish": "Connect and Publish Proposal", + "reset": "Reset Form", + "loadPrivateKey": "Load Vault file", + "finish": "Show Proposals" + }, + "form": { + "operatorSeed.label": "Operator Seed", + "operatorSeed.error.required": "Operator is required", + "sourceSeed.label": "Computor to use for proposal", + "sourceSeed.error.required": "Computor is required", + "title.label": "Proposal Title", + "title.placeholder": "Proposal Title", + "title.error.required": "Title is required", + "title.error.min": "Title must have at least 2 characters", + "title.error.max": "Title must have at maximum 100 characters", + "description.label": "Proposal Description", + "description.placeholder": "Proposal Description", + "description.error.min": "Description must have at least 2 characters", + "description.error.max": "Description must have at maximum 1000 characters", + "description.error.required": "Description is required", + "option.label": "Option {{id}}", + "option.placeholder": "Option {{id}}", + "option.error.required": "Option {{id}} is required", + "option.error.min": "Option must have at least 2 characters", + "option.error.max": "Option must have at maximum 50 characters", + "computorIp.label": "Computor IP Address", + "computorIp.placeholder": "Computor IP Address", + "computorIp.error.required": "Computor IP Address required" + }, + "proposalStep.label": "Create Proposal", + "publishStep.label": "Publish Proposal", + "finishStep.label": "Done", + "finishStep.success": "Your Proposal has been sent to your computor." + }, + "status": { + "success": "Accepted by Quorum", + "failed": "Dismissed by Quorum", + "publishing": "Publish in progress", + "pending": "Voting is open", + "draft": "Draft", + "unknown": "Unknown status" + } + }, + "ipoComponent": { + "messages": { + "unlock": "Please unlock your Wallet first", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Your IPO could not be sent. Pleas try again later.", + "failedToDecrypt": "We were not able to decrypt your seed. Did you use the correct unlock file (private key)??", + "failedToValidate": "We had validation errors. Please check the form." + }, + "title": "Qubic IPO", + "description": "The Qubic IPO is an auction for shares of smart contracts.", + "noIpos": "Currently no IPO's active", + "yourBids": "Your Bids", + "yourShares": "Your Shares", + "sharesFor": "Shares for", + "statusValid": "Status valid for tick {{tick}}", + "livPanelHint": "Check out current Results", + "buttons.place-bid": "Place Bid", + "buttons.refresh": "Refresh Status", + "bidStatus.hint": "The status shows only if your bid has been placed. NOT if it was successful.", + "bidStatus.pcs": "pcs", + "place-bid": { + "title": "Place a Bid", + "needBalance": "You need at least one seed with a positive balance.", + "noContract": "Contract not found. Please try again later.", + "noContract.gotoIpoLabel": "Show available Contract IPO's", + "buttons": { + "send": "Send Bid" + }, + "form": { + "quantity": { + "placeholder": "Quantity", + "error.min": "Minimum 1", + "error.required": "Quantity is required" + }, + "price": { + "placeholder": "Price (qus)", + "error.min": "Minimum 1", + "error.required": "Price is required", + "max.tooltip": "Bid all available qus" + } + } + } + }, + "okDialog": { + "title": "Notice", + "button": "Yes, I confirm.", + "messages": { + "tresorText": "Have you downloaded your Vault file now? Please select this Vault file in the next step to open the Vault!" + } + }, + "loadConfigComponent": { + "title": "Import Addresses", + "buttons": { + "import": "Import", + "cancel": "Start Without Addresses" + }, + "messages": { + "import": "If you already have a wallet address config file containing your PublicKeys, you should select and import it now.", + "noImport": "If you do not yet have a wallet address config file, create an account in the next section." + } + }, + "exportConfigComponent": { + "title": "Export Vault File", + "buttons": { + "export": "Export", + "cancel": "Cancel", + "unlock": "Unlock Vault" + }, + "messages": { + "unlockInfo": "Please unlock your Vault to be able to export your Vault file with the newest inventory.", + "export": "You have modified your account inventory. Be sure to download your current vault file so you can import it later.", + "info": "It contains your account inventory, settings and encrypted seeds. The Vault file will be protected by the provided password." + } + }, + "welcomeComponent": { + "welcomeMessage": "To use this Wallet you must either create or import your existing Vault. This will contain your public/private key which afterwards is used to encrypt/decrypt your data.", + "button": { + "createVault": "Create Vault", + "importVault": "Import Vault" + }, + "title": "Welcome to the Qubic Wallet" + }, + "importComponent": { + "title": "Import Vault", + "message": "You can import an existing Vault to your Wallet." + }, + "createVaultComponent": { + "createVault": { + "message": "This step will create a private/public key pair for the wallet. Choose a name and select \"Create Vault\" to create your Qubic\r\n Wallet.", + "stepTitle": "Create Vault", + "vaultName": "Name", + "button": "Create Vault" + }, + "createAddress": { + "title": "Add Address", + "message": "In your Qubic Wallet you can have multiple Addresses. Every Address\r\n consists of a Seed (private Key) and a Public Id. The Seed is needed to\r\n send Qubic and the Public Id can be used to receive Qubic. We create now\r\n your first Address.", + "addressNam": "Name", + "seed": "Seed", + "seedPlaceholder": "Choose a random seed...", + "publicId": "Public Id", + "radomizeSeed": "Randomize Seed", + "addressPlaceholder": "Choose an Account Name", + "button": "Create Address" + }, + "downloadVault": { + "stepTitle": "Download initial Vault", + "message": "Your personal Vault has been created. You can now download it. Please\r\n choose a secure Password and select \"Download Vault\".", + "password": "Password", + "passwordHint": "Choose a secure password...", + "button": "Download Vault" + }, + "verifyVault": { + "stpTitle": "Load/Import Vault", + "message": "The Vault file which you have downloaded is the file which contains\r\n all important information. Everytime when you want to unlock your\r\n wallet, you will need this file. Everytime when you change your Wallet\r\n (e.g. add or edit an address) you will be prompted do download the\r\n newest Vault file. To Ensure this works for you. Please select below\r\n the downloaded Vault file and enter your Vault Password again.", + "password": "Password", + "passwordHint": "Your Vault Password", + "button": "Verify Vault File" + }, + "done": { + "stepTitle": "Done", + "message": "Happy Qubic! Your Wallet is ready.", + "button": "Open My Wallet" + }, + "buttons": { + "cancel": "Cancel", + "reset": "Reset" + } + } +} diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json new file mode 100644 index 0000000..33b9624 --- /dev/null +++ b/src/assets/i18n/es.json @@ -0,0 +1,547 @@ +{ + "general": { + "title": "Qubic - Wallet", + "comingSoon": "¡próximamente disponible!", + "navigation": { + "home": "Dashboard", + "payment": "Pago", + "balance": "Saldo", + "settings": "Configuraciones", + "voting": "Votación", + "ipo": "IPO", + "assets": "Assets" + }, + "version": "Versión {{version}} - beta", + "version.url": "qubic.li", + "copy.tooltip": "Copiar", + "error": "Error", + "close": "cerrar", + "currency": "QUBIC", + "currentTick": "Tick: {{tick}}", + "loading": "cargando...", + "buttons": { + "close": "Cerrar", + "maximize": "Maximizar" + }, + "messages": { + "notConnected": "No está conectado a la red Qubic. Por favor, conéctese.", + "refreshRequested": "Actualización solicitada", + "refreshFailed": "Falló la actualización, por favor intente más tarde", + "balanceReceived": "La red indica un saldo de {{balance}} QUBIC para {{publicId}}.", + "timeoutTryAgain": "Se agotó el tiempo de espera del sistema. Por favor, intente nuevamente." + } + }, + "payment": { + "keyRequestReason": "Como las transacciones son firmadas digitalmente con su clave, debe cargarla previamente." + }, + "confirmDialog": { + "title": "Confirmar", + "buttons": { + "cancel": "Cancelar", + "confirm": "Sí, confirmo" + }, + "confirmationText": "¿Está seguro?" + }, + "notifyComponent": { + "saveYourSettings": "Por favor, exporte/descargue sus configuraciones. Sus configuraciones contienen las Seed cifradas necesarias para restaurar el Wallet.", + "saveYourKey": "Por favor, guarde su archivo Wallet en un lugar seguro.", + "qubicLiSync": "Sincronice sus configuraciones con qubic.li", + "qubicOffline": "Red QUBIC no conectada", + "qubicOnline": "Conectado a la red QUBIC" + }, + "revealSeedComponent": { + "title": "Información de la dirección", + "publicId": "ID de la dirección", + "privateId": "Seed de 55 caracteres", + "buttons": { + "close": "Cerrar" + } + }, + "assetsComponent": { + "title": "Your Assets", + "openAssets": "Ir a Asset Management", + "overview": { + "title": "Asset Overview" + }, + "table": { + "publicId": "Public ID", + "contractIndex": "Contract Index", + "assetName": "Asset Name", + "contractName": "Contrato", + "ownedAmount": "Owned Amount", + "possessedAmount": "Possessed Amount", + "tick": "Válido para el Tick {{tick}}", + "reportingNodes": "Reporting Nodes", + "issuerIdentity": "Issuer Identity" + }, + "buttons": { + "close": "Cerrar", + "refresh": "Refrescar", + "send": "Enviar Assets" + }, + "form": { + "info": "Envío de Assets", + "fees": "Costo fijo del envío: 1,000,000 Qubic", + "select": "Seleccione un Asset", + "select.error": "Debe seleccionar un Asset", + "placeholder": "Address ID of the receiver", + "placeholder.error": "Se requiere clave privada Qubic (Seed) de 55 caracteres.", + "amount": "Cantidad a enviar", + "amount.error": "Se requiere la cantidad", + "amount.value.error": "La cantidad debe ser mayor a 0", + "amount.max.error": "La cantidad no puede exceder su saldo actual", + "tick": "Tick", + "tick.error": "El Tick es requerido", + "tick.tooltip": "El Tick es requerido", + "tick.min": "El Tick debe ser igual o mayor a {{currentTick}}", + "buttons": { + "send": "Enviar", + "cancel": "Cancelar", + "error.balance": "No tiene saldo suficiente. Se requiere un mínimo de 1,000,000 Qubic" + } + }, + "noAssets": "No assets available" + }, + "qrReceiveComponent": { + "title": "Recibir un pago", + "downloadLink": "Descargar", + "hint": "Escanee/envíe este Código QR para recibir un pago para {{publicId}}.", + "buttons.close": "Cerrar" + }, + "seedEditComponent": { + "title.add": "Agregar una dirección", + "title.edit": "Editar una dirección", + "newSeedName": "Nombre-Dirección", + "seedWarning": "¡Estos 55 caracteres son su clave privada Qubic (Seed)! ¡Guárdela en algún lugar!", + "form": { + "alias": { + "placeholder": "Elija un nombre único para su dirección para referirse a ella más fácilmente.", + "error": { + "required": "Nombre requerido", + "min": "El nombre debe tener al menos 3 caracteres", + "max": "El nombre no debe exceder los 50 caracteres", + "regex": "Solo puede contener {{regex}}" + } + }, + "seed": { + "placeholder": "Seed de 55 caracteres", + "error": { + "required": "Se requiere una Seed de 55 caracteres.", + "min": "La Seed de 55 caracteres debe estar compuesta exactamente de 55 caracteres en minúsculas", + "max": "La Seed de 55 caracteres debe estar compuesta exactamente de 55 caracteres en minúsculas", + "regex": "Solo puede contener caracteres a-zA-Z0-9_-" + }, + "generateSeed": "Generar aleatoriamente una Seed de 55 caracteres." + }, + "watchOnlyAddress": { + "title": "Watch-Only-Address", + "placeholder": "Clave pública de 60 caracteres", + "error": { + "required": "Se requiere una clave pública de 60 caracteres", + "min": "La clave pública debe contener exactamente 60 caracteres en máyuscula", + "max": "La clave pública debe contener exactamente 60 caracteres en máyuscula", + "regex": "Solo puede contener caracteres A-Z" + } + }, + "error": { + "text": "Por favor, verifique el formulario.", + "close": "Cerrar" + } + }, + "publicIdMessage": "Su ID de dirección es:", + "privateKeyWarning": "¡Atención! Su archivo Wallet no está cargado. Asegúrese de haberlo guardado de manera segura.", + "buttons": { + "cancel": "Cancelar", + "create": "Crear una dirección", + "save": "Guardar la dirección" + } + }, + "seedOverviewComponent": { + "title": "Direcciones", + "isTable": "Mostrar como tabla", + "addSeedButton": "Agregar una dirección", + "importButton": "Importar", + "exportButton": "Exportar", + "search.label": "Buscar", + "table": { + "alias": "Nombre de dirección", + "publicId": "ID de dirección", + "balance": "Saldo", + "epochChanges": "Cambios de Epoch", + "noData": "Ningún dato corresponde al filtro \"{{q}}\"", + "actions": { + "title": "Acciones", + "revealSeed": "Revelar la Seed de 55 caracteres", + "assets": "Mostrar activos poseídos", + "makePayment": "Realizar un pago", + "receivePayment": "Generar un Código QR para recibir un pago", + "editSeed": "Editar la dirección", + "deleteSeed": "Eliminar la dirección", + "refreshBalance": "Actualizar el saldo desde la red" + } + }, + "hasPendingTransaction": "Transacciones pendientes", + "marketPrice": "Price", + "marketSupply": "Supply", + "marketCap": "Marketcap", + "marketCurrency": "$" + }, + "dashboard": { + "title": "Dashboard", + "balance": "Wallet balance", + "currency": "Qu", + "totalBalance": "Your Total Balance" + }, + "unlockComponent": { + "title": "Desbloquear el Wallet", + "title.new": "Crear un Wallet", + "welcomeMessage": "Bienvenido al Wallet qubic.li.\nPara usar este Wallet, debe crear un archivo Wallet. Contendrá su clave pública/privada que luego se usará para cifrar/descifrar sus datos.", + "reasonMessage": "Para desbloquear su Wallet, es necesario su archivo Wallet. Este archivo se elimina automáticamente una vez que esta página se recarga o se cierra.", + "choosePrivateKeyFile": "Elegir el archivo Wallet", + "chooseConfigFile": "Choose wallet config file", + "overwriteVault": "Parece que ya hay datos guardados en este navegador. ¿Realmente desea sobrescribirlos?", + "form": { + "file.error.required": "Archivo Wallet requerido", + "password.error.required": "Contraseña del Wallet requerida", + "password.error.min": "Su contraseña debe tener al menos 8 caracteres.", + "configFile": { + "error": { + "required": "Config file required" + } + } + }, + "buttons": { + "cancel": "Cancelar", + "generateKey": "Crear un nuevo Wallet", + "importAndUnlock": "Import Vault and Unlock", + "unlock": "Desbloquear el Wallet", + "existingUser": "Ya tengo un Wallet", + "newUser": "Create Vault", + "closeWallet": "Cerrar el Wallet", + "importVault": "Import Vault" + }, + "welcomeHintMessage": "After you have downloaded your Vault file. You need to select the downloaded file and enter your password again. This will unlock your wallet." + }, + "lockIconComponent": { + "lock": "Bloquear el Wallet", + "unlock": "Desbloquear el Wallet" + }, + "lockComponent": { + "title": "¿Cerrar el Wallet?", + "forceDownload": { + "title": "Descargar el archivo Wallet", + "reason": "Cuando bloquea su Wallet, su archivo Wallet se elimina automáticamente. Sin este archivo Wallet, no se pueden realizar transacciones. Asegúrese de que su archivo Wallet esté guardado de manera segura. Expórtelo de nuevo en caso de duda...", + "buttons": { + "allOk": "Tengo mi archivo de desbloqueo, gracias" + } + }, + "reason": "Es esencial almacenar su archivo Wallet de manera segura. Por favor, elija una contraseña fuerte que no olvidará, y luego haga clic en \"guardar\".", + "warning": "Confirmo haber guardado mi archivo Wallet.", + "password.placeholder": "Contraseña", + "password.required": "Contraseña requerida", + "password.min": "La contraseña debe tener al menos 8 caracteres.", + "buttons": { + "savePrivateKey": "Guardar el archivo Wallet", + "closeWallet": "Bloquear el Wallet", + "exportAndCloseWallet": "Export Vault file and Lock Wallet", + "enableExport": "Exportar", + "cancel": "Cancelar" + } + }, + "paymentComponent": { + "title": "Enviar unidades Qubic (qus)", + "messages": { + "pleaseUnlock": "Por favor, desbloquee su Wallet primero", + "storedForPropagation": "Su transacciíon se ha guardado y será enviada en el tick {{tick}}", + "failedToSend": "Su transacción no pudo ser enviada. Por favor, intente más tarde.", + "failedToDecrypt": "No pudimos descifrar su Seed. ¿Utilizó la clave privada correcta?", + "failedValidation": "Hemos encontrado errores de validación. Por favor, verifique el formulario." + }, + "form": { + "sourceSeed": { + "label": "Dirección desde la que se enviarán los qus", + "error": { + "required": "Se requiere la dirección del remitente" + } + }, + "receiver": { + "placeholder": "ID de la dirección del destinatario", + "hint": "60 caracteres en mayúsculas", + "chooseOwnSeed": "Elegir su propio ID de dirección", + "error": { + "required": "Se requiere el ID de la dirección", + "length": "Un ID de dirección Qubic consta de 60 letras mayúsculas." + } + }, + "amount": { + "placeholder": "Cantidad en unidades Qubic (qus)", + "max.tooltip": "Establecer al monto máximo disponible para esta Seed", + "error": { + "required": "Se requiere la cantidad", + "min": "La cantidad debe ser al menos de 1" + } + }, + "tick": { + "placeholder": "Tick de ejecución", + "customize.tooltip": "Alternar para establecer un Tick de ejecución personalizado", + "error": { + "required": "Se requiere el Tick", + "min": "El Tick debe ser al menos de {{currentTick}}" + } + } + }, + "buttons": { + "send": "Realizar la transacción", + "reset": "Restablecer", + "loadPrivateKey": "Cargar el archivo Wallet" + } + }, + "balanceComponent": { + "title": "Saldo", + "createSeedHint": "Por favor, primero cree una Seed", + "overview": { + "title": "Visión general", + "totalWalletValue": "Valor fijo del Wallet", + "estimatedWalletValue": "Valor estimado del Wallet", + "baseDate": "al" + }, + "transactions": { + "title": "Transacciones de la época actual", + "verificationAlert": "Los datos del resumen no pudieron ser verificados", + "noTransactions": "No se encontraron transacciones", + "send.tooltip": "Transferencia saliente", + "exchange.tooltip": "Transferencia interna", + "explorer.tooltip": "Mostrar la transferencia en el Explorador", + "receive.tooltip": "Transferencia entrante", + "status.pending.tooltip": "Pendiente", + "status.executed.tooltip": "Ejecutado", + "status.dismissed.tooltip": "Rechazado", + "status.unknown.tooltip": "Desconocido", + "status.confirmed.tooltip": "Registrado", + "filter.seed.label": "Filtrar por Seed" + }, + "repeatTransaction": "Repetir la transacción" + }, + "settings": { + "general": { + "tickAddition.placeholder": "Número de Ticks añadidos al tick actual para enviar una nueva transacción", + "webBridge.placeholder": "Activar el Web Bridge (Conexión directa a la red QUBIC)", + "button.save": "Guardar configuraciones", + "beta": { + "placeholder": "Enable Beta Features" + } + }, + "import": { + "title": "Importar configuraciones", + "doneMessage": "Importación exitosa", + "dropMessage": "Suelte su configuración aquí para importarla", + "buttons.import": "Importar la configuración", + "seedsMessage": "Está a punto de importar {{amount}} Seed.", + "goHomeLink": "Mostrar las Seeds importadas" + }, + "export": { + "title": "Exportar configuraciones", + "hint": "Presione el botón de abajo para descargar su configuración actual. Contiene sus Seeds cifradas. También debería haber guardado su clave privada.", + "buttons.export": "Exportar/Guardar la configuración" + } + }, + "votingComponent": { + "title": "Voto Computor Qubic", + "description": "El voto computor Qubic se utiliza para alcanzar un consenso sobre temas a decidir en toda la red. Esto puede incluir la aceptación de contratos inteligentes o la toma de decisiones protocolarias. Solo los computors están autorizados a participar.", + "proposals": { + "editButton": "Editar", + "createButton": "Crear una propuesta", + "voteButton": "Votar", + "title": "{{amount}} Propuestas actuales", + "noComputorHint": "No has registrado ningún Computor. Si deseas proponer algo, debes tener al menos una Seed Computor.", + "votingResult": "Resultado de la votación", + "noVotes": "ningún voto", + "from": "De:", + "url": "URL de la propuesta:" + }, + "participate": { + "title": "Participar", + "cancelButton": "Cancelar", + "sendVotesButton": "Enviar votos", + "notConfirmedMessage": "Esta propuesta aún no está confirmada por la red Qubic. Por favor, espera para votar.", + "noComputorsText": "No tienes Computors o tus Computors ya han creado una propuesta.", + "computorsSelected": "Computors seleccionados" + }, + "create": { + "title": "Crear una propuesta", + "cancelButton": "Cancelar", + "sendVotesButton": "Enviar la propuesta", + "alreadyPublished": "Este Computor ya ha publicado una propuesta. Solo se permite una por época", + "buttons": { + "create": "Crear una propuesta", + "publish": "Conectar y publicar la propuesta", + "reset": "Reiniciar el formulario", + "loadPrivateKey": "Cargar el archivo Wallet", + "finish": "Ver las propuestas" + }, + "form": { + "operatorSeed.label": "Seed del operador", + "operatorSeed.error.required": "Se requiere el operador", + "sourceSeed.label": "Computor a utilizar para la propuesta", + "sourceSeed.error.required": "Se requiere el computor", + "title.label": "Título de la propuesta", + "title.placeholder": "Título de la propuesta", + "title.error.required": "Se requiere el título", + "title.error.min": "El título debe tener al menos 2 caracteres", + "title.error.max": "El título no debe exceder los 100 caracteres", + "description.label": "Descripción de la propuesta", + "description.placeholder": "Descripción de la propuesta", + "description.error.min": "La descripción debe tener al menos 2 caracteres", + "description.error.max": "La descripción no debe exceder los 1000 caracteres", + "description.error.required": "Se requiere la descripción", + "option.label": "Opción {{id}}", + "option.placeholder": "Opción {{id}}", + "option.error.required": "Se requiere la opción {{id}}", + "option.error.min": "La opción debe tener al menos 2 caracteres", + "option.error.max": "La opción no debe exceder los 50 caracteres", + "computorIp.label": "Dirección IP del computor", + "computorIp.placeholder": "Dirección IP del computor", + "computorIp.error.required": "Se requiere la dirección IP del computor" + }, + "proposalStep.label": "Crear una propuesta", + "publishStep.label": "Publicar la propuesta", + "finishStep.label": "Terminado", + "finishStep.success": "Tu propuesta ha sido enviada a tu computor." + }, + "status": { + "success": "Aceptado por el quorum", + "failed": "Rechazado por el quorum", + "publishing": "Publicación en curso", + "pending": "Votación abierta", + "draft": "Borrador", + "unknown": "Estado desconocido" + } + }, + "ipoComponent": { + "messages": { + "unlock": "Por favor, desbloquea tu Wallet primero", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Tu IPO no pudo ser enviada. Por favor, intenta de nuevo más tarde.", + "failedToDecrypt": "No pudimos descifrar tu Seed. ¿Has utilizado la clave privada correcta?", + "failedToValidate": "Hemos encontrado errores de validación. Por favor, verifica el formulario." + }, + "title": "Qubic IPO", + "description": "El IPO Qubic es una subasta para partes de contratos inteligentes.", + "noIpos": "Actualmente no hay IPOs activas", + "yourBids": "Tus Ofertas", + "yourShares": "Tus Acciones", + "sharesFor": "Acciones para", + "statusValid": "Estado válido para el tick {{tick}}", + "livPanelHint": "Consulta los Resultados Actuales", + "buttons.place-bid": "Hacer una Oferta", + "buttons.refresh": "Actualizar el Estado", + "bidStatus.hint": "El estado solo se muestra si tu oferta ha sido colocada. NO si ha sido exitosa.", + "bidStatus.pcs": "pcs", + "place-bid": { + "title": "Hacer una Oferta", + "needBalance": "Necesitas al menos una Seed con saldo positivo.", + "noContract": "Contrato no encontrado. Por favor, intenta de nuevo más tarde.", + "noContract.gotoIpoLabel": "Ver IPOs de Contratos disponibles", + "buttons": { + "send": "Enviar la Oferta" + }, + "form": { + "quantity": { + "placeholder": "Cantidad", + "error.min": "Mínimo 1", + "error.required": "Se requiere la cantidad" + }, + "price": { + "placeholder": "Precio (qus)", + "error.min": "Mínimo 1", + "error.required": "Se requiere el precio", + "max.tooltip": "Ofrecer todos los qus disponibles" + } + } + } + }, + "okDialog": { + "title": "Nota", + "button": "Sí, confirmo.", + "messages": { + "tresorText": "¿Ha descargado su archivo de bóveda ahora? Por favor, elija este archivo de bóveda en el siguiente paso para abrir la billetera." + } + }, + "loadConfigComponent": { + "title": "Importar cuentas", + "buttons": { + "import": "Importar", + "cancel": "Cancelar" + }, + "messages": { + "import": "Si ya tiene un archivo .config que contiene sus claves públicas, selecciónelo ahora e impórtelo.", + "noImport": "Si aún no tiene un archivo .config, cree una cuenta en la próxima sección." + } + }, + "exportConfigComponent": { + "title": "Exportar cuentas", + "buttons": { + "export": "Exportar", + "cancel": "Cancelar" + }, + "messages": { + "export": "Has modificado tu inventario de cuentas. Asegúrate de descargar tu configuración actual para poder importarla más tarde.", + "info": "Contiene tus seeds encriptadas.", + "unlockInfo": "Please unlock your Vault to be able to export your Vault file with the newest inventory." + } + }, + "welcomeComponent": { + "welcomeMessage": "To use this Wallet you must either create or import your existing Vault. This will contain your public/private key which afterwards is used to encrypt/decrypt your data.", + "button": { + "createVault": "Create Vault", + "importVault": "Import Vault" + }, + "title": "Welcome to the Qubic Wallet" + }, + "importComponent": { + "title": "Import Vault", + "message": "You can import an existing Vault to your Wallet." + }, + "createVaultComponent": { + "createVault": { + "message": "This step will create a private/public key pair for the wallet. Choose a name and select \"Create Vault\" to create your Qubic\r\n Wallet.", + "stepTitle": "Create Vault", + "vaultName": "Name", + "button": "Create Vault" + }, + "createAddress": { + "title": "Add Address", + "message": "In your Qubic Wallet you can have multiple Addresses. Every Address\r\n consists of a Seed (private Key) and a Public Id. The Seed is needed to\r\n send Qubic and the Public Id can be used to receive Qubic. We create now\r\n your first Address.", + "addressNam": "Name", + "seed": "Seed", + "seedPlaceholder": "Choose a random seed...", + "publicId": "Public Id", + "radomizeSeed": "Randomize Seed", + "addressPlaceholder": "Choose an Account Name", + "button": "Create Address" + }, + "downloadVault": { + "stepTitle": "Download initial Vault", + "message": "Your personal Vault has been created. You can now download it. Please\r\n choose a secure Password and select \"Download Vault\".", + "password": "Password", + "passwordHint": "Choose a secure password...", + "button": "Download Vault" + }, + "verifyVault": { + "stpTitle": "Load/Import Vault", + "message": "The Vault file which you have downloaded is the file which contains\r\n all important information. Everytime when you want to unlock your\r\n wallet, you will need this file. Everytime when you change your Wallet\r\n (e.g. add or edit an address) you will be prompted do download the\r\n newest Vault file. To Ensure this works for you. Please select below\r\n the downloaded Vault file and enter your Vault Password again.", + "password": "Password", + "passwordHint": "Your Vault Password", + "button": "Verify Vault File" + }, + "done": { + "stepTitle": "Done", + "message": "Happy Qubic! Your Wallet is ready.", + "button": "Open My Wallet" + }, + "buttons": { + "cancel": "Cancel", + "reset": "Reset" + } + } +} diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json new file mode 100644 index 0000000..b3f8104 --- /dev/null +++ b/src/assets/i18n/fr.json @@ -0,0 +1,548 @@ +{ + "general": { + "title": "Qubic - Wallet", + "comingSoon": "bientôt disponible !", + "navigation": { + "home": "Accueil", + "payment": "Paiement", + "balance": "Solde", + "settings": "Paramètres", + "voting": "Vote", + "ipo": "IPO", + "assets": "Assets" + }, + "version": "Version {{version}} - bêta", + "version.url": "qubic.li", + "copy.tooltip": "Copier", + "error": "Erreur", + "close": "fermer", + "currency": "QUBIC", + "currentTick": "Tick : {{tick}}", + "loading": "chargement...", + "buttons": { + "close": "Fermer", + "maximize": "Maximiser" + }, + "messages": { + "notConnected": "Non connecté au réseau Qubic. Veuillez vous connecter.", + "refreshRequested": "Actualisation demandée", + "refreshFailed": "Échec de l'actualisation, veuillez réessayer plus tard", + "balanceReceived": "Le réseau indique un solde de {{balance}} QUBIC pour {{publicId}}.", + "timeoutTryAgain": "We run into a timeout. Please try again." + } + }, + "payment": { + "keyRequestReason": "Les transactions étant signées numériquement avec votre clé, vous devez la charger au préalable." + }, + "confirmDialog": { + "title": "Confirmer", + "buttons": { + "cancel": "Annuler", + "confirm": "Oui, je confirme" + }, + "confirmationText": "Êtes-vous sûr ?" + }, + "notifyComponent": { + "saveYourSettings": "Veuillez exporter/télécharger vos paramètres. Vos paramètres contiennent les Seed cryptées nécessaires pour restaurer le Wallet.", + "saveYourKey": "Veuillez stocker votre fichier Wallet dans un endroit sûr.", + "qubicLiSync": "Synchronisez vos paramètres avec qubic.li", + "qubicOffline": "Réseau QUBIC non connecté", + "qubicOnline": "Connecté au réseau QUBIC" + }, + "revealSeedComponent": { + "title": "Informations sur l'adresse", + "publicId": "ID de l'adresse", + "privateId": "Seed de 55 caractères", + "buttons": { + "close": "Fermer" + } + }, + "assetsComponent": { + "title": "Vos Assets", + "openAssets": "Ouvrir la Gestion des Asset", + "overview": { + "title": "Vue d'ensemble des Assets" + }, + "table": { + "publicId": "ID Public", + "contractIndex": "Index du Contrat", + "assetName": "Nom de l'Asset", + "contractName": "Nom du Contrat", + "ownedAmount": "Quantité Possédée", + "possessedAmount": "Quantité en Possession", + "tick": "Valide pour le Tick {{tick}}", + "reportingNodes": "Nœuds Rapporteurs", + "issuerIdentity": "Identité de l'Émetteur" + }, + "buttons": { + "close": "Fermer", + "refresh": "Rafraichir", + "send": "Envoyer" + }, + "form": { + "info": "Envoyer Assets", + "fees": "Frais d'envoi fixes : 1 000 000 Qubic", + "balance": "Votre solde après déduction des frais de transfert (1 million de Qubics) sera de:", + "select": "Sélectionner l'Asset", + "select.error": "La sélection de l'asset est requise", + "placeholder": "ID de l'adresse du destinataire", + "placeholder.error": "Un seed de 55 caractères est requis.", + "amount": "Montant à envoyer", + "amount.error": "Le montant est requis", + "amount.value.error": "Le montant doit être supérieur à 0", + "amount.max.error": "Le montant ne peut pas dépasser la quantité détenue", + "tick": "Tick", + "tick.error": "Le Tick est requis", + "tick.tooltip": "Le Tick est requis", + "tick.min": "Tick minimum doit être de {{currentTick}}", + "buttons": { + "send": "Envoyer Assets", + "cancel": "Annuler", + "error.balance": "Balance insuffisante, vous devez avoir un minimum de 1,000,000 Qubic" + } + }, + "noAssets": "Aucun asset disponible" + }, + "qrReceiveComponent": { + "title": "Recevoir un paiement", + "downloadLink": "Télécharger", + "hint": "Scannez/envoyez ce QR Code pour recevoir un paiement pour {{publicId}}.", + "buttons.close": "Fermer" + }, + "seedEditComponent": { + "title.add": "Ajouter une adresse", + "title.edit": "Modifier une adresse", + "newSeedName": "Nom-Adresse", + "seedWarning": "Ces 55 caractères sont votre clé privée Qubic (Seed) ! Sauvegardez-la quelque part !", + "form": { + "alias": { + "placeholder": "Choisissez un nom unique à votre adresse pour y faire référence plus facilement.", + "error": { + "required": "Nom requis", + "min": "Le nom doit avoir au moins 3 caractères", + "max": "Le nom ne doit pas dépasser 50 caractères", + "regex": "Ne peut contenir que {{regex}}" + } + }, + "seed": { + "placeholder": "Seed de 55 caractères", + "error": { + "required": "Une Seed de 55 caractères est requise.", + "min": "La Seed de 55 caractères doit être composée exactement de 55 caractères en minuscules", + "max": "La Seed de 55 caractères doit être composée exactement de 55 caractères en minuscules", + "regex": "Ne peut contenir que a-zA-Z0-9_-" + }, + "generateSeed": "Générer aléatoirement une Seed de 55 caractères." + }, + "watchOnlyAddress": { + "title": "Watch-Only-Address", + "placeholder": "60-char public-key", + "error": { + "required": "An 60-char public-key is required.", + "min": "The 60-char public-key must exactly consist of 60 upper case characters", + "max": "The 60-char public-key must exactly consist of 60 upper case characters", + "regex": "Can only contain A-Z" + } + }, + "error": { + "text": "Veuillez vérifier le formulaire.", + "close": "fermer" + } + }, + "publicIdMessage": "Votre ID d'adresse est :", + "privateKeyWarning": "Attention ! Votre fichier Wallet n'est pas chargé. Assurez-vous de l'avoir sauvegardé en sécurité.", + "buttons": { + "cancel": "Annuler", + "create": "Créer une adresse", + "save": "Sauvegarder l'adresse" + } + }, + "seedOverviewComponent": { + "title": "Addresses", + "isTable": "Show table", + "addSeedButton": "Ajouter une adresse", + "importButton": "Importer", + "exportButton": "Exporter", + "search.label": "Rechercher", + "table": { + "alias": "Nom d'adresse", + "publicId": "ID d'adresse", + "balance": "Solde", + "epochChanges": "Changements d'Epoch", + "noData": "Aucune donnée correspondant au filtre \"{{q}}\"", + "actions": { + "title": "Actions", + "revealSeed": "Révéler la Seed de 55 caractères", + "assets": "Afficher les actifs possédés", + "makePayment": "Effectuer un paiement", + "receivePayment": "Générer un QR Code pour recevoir un paiement.", + "editSeed": "Modifier l'adresse", + "deleteSeed": "Supprimer l'adresse", + "refreshBalance": "Actualiser le solde depuis le réseau" + } + }, + "hasPendingTransaction": "Transactions en attente", + "marketPrice": "Price", + "marketSupply": "Supply", + "marketCap": "Marketcap", + "marketCurrency": "$" + }, + "dashboard": { + "title": "Dashboard", + "balance": "Wallet balance", + "currency": "Qu", + "totalBalance": "Your Total Balance" + }, + "unlockComponent": { + "title": "Déverrouiller le Wallet", + "title.new": "Créer un Wallet", + "welcomeMessage": "Bienvenue dans le Wallet qubic.\nPour utiliser ce Wallet, vous devez créer un fichier Wallet. Il contiendra votre clé publique/privée qui sera ensuite utilisée pour chiffrer/déchiffrer vos données.", + "reasonMessage": "Pour déverrouiller votre Wallet, votre fichier Wallet est nécessaire. Ce fichier est automatiquement supprimé une fois cette page rechargée ou fermée.", + "choosePrivateKeyFile": "Choisir le fichier Wallet", + "chooseConfigFile": "Choose wallet config file", + "overwriteVault": "Il semble qu'il y ait déjà des données enregistrées dans ce navigateur. Voulez-vous vraiment les écraser ?", + "form": { + "file.error.required": "Fichier Wallet requis", + "password.error.required": "Mot de passe du Wallet requis", + "password.error.min": "Votre mot de passe doit comporter au moins 8 caractères.", + "configFile": { + "error": { + "required": "Config file required" + } + } + }, + "buttons": { + "cancel": "Annuler", + "generateKey": "Créer un nouveau Wallet", + "importAndUnlock": "Import Vault and Unlock", + "unlock": "Déverrouiller le Wallet", + "existingUser": "J'ai déjà un Wallet", + "newUser": "Create Vault", + "closeWallet": "Fermer le Wallet", + "importVault": "Import Vault" + }, + "welcomeHintMessage": "After you have downloaded your Vault file. You need to select the downloaded file and enter your password again. This will unlock your wallet." + }, + "lockIconComponent": { + "lock": "Verrouiller le Wallet", + "unlock": "Déverrouiller le Wallet" + }, + "lockComponent": { + "title": "Fermer le Wallet ?", + "forceDownload": { + "title": "Télécharger le fichier Wallet", + "reason": "Lorsque vous verrouillez votre Wallet, votre fichier Wallet est automatiquement supprimé. Sans ce fichier Wallet, aucune transaction ne peut être effectuée. Assurez-vous que votre fichier Wallet est sauvegardé en toute sécurité. Exportez-le à nouveau en cas de doute...", + "buttons": { + "allOk": "J'ai mon fichier de déverrouillage, merci" + } + }, + "reason": "Il est essentiel de stocker votre fichier Wallet en sécurité. Veuillez choisir un mot de passe fort que vous n'oublierez pas, puis cliquez sur \"sauvegarder\".", + "warning": "Je confirme avoir sauvegardé mon fichier Wallet.", + "password.placeholder": "Mot de passe", + "password.required": "Mot de passe requis", + "password.min": "Le mot de passe doit comporter au moins 8 caractères.", + "buttons": { + "savePrivateKey": "Sauvegarder le fichier Wallet", + "closeWallet": "Verrouiller le Wallet", + "exportAndCloseWallet": "Export Vault file and Lock Wallet", + "enableExport": "Exporter", + "cancel": "Annuler" + } + }, + "paymentComponent": { + "title": "Envoyer des unités Qubic (qus)", + "messages": { + "pleaseUnlock": "Veuillez d'abord déverrouiller votre Wallet", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Votre transaction n'a pas pu être envoyée. Veuillez réessayer plus tard.", + "failedToDecrypt": "Nous n'avons pas pu déchiffrer votre Seed. Avez-vous utilisé la bonne clé privée ??", + "failedValidation": "Nous avons eu des erreurs de validation. Veuillez vérifier le formulaire." + }, + "form": { + "sourceSeed": { + "label": "Adresse depuis laquelle les qus seront envoyés", + "error": { + "required": "L'adresse de l'expéditeur est requise" + } + }, + "receiver": { + "placeholder": "ID de l'adresse du destinataire", + "hint": "60 caractères majuscules", + "chooseOwnSeed": "Choisir votre propre ID d'adresse", + "error": { + "required": "L'ID de l'adresse est requis", + "length": "Un ID d'adresse Qubic se compose de 60 lettres majuscules." + } + }, + "amount": { + "placeholder": "Montant en unités Qubic (qus)", + "max.tooltip": "Régler sur le montant maximum disponible pour cette Seed", + "error": { + "required": "Le montant est requis", + "min": "Le montant doit être au minimum de 1" + } + }, + "tick": { + "placeholder": "Tick d'exécution", + "customize.tooltip": "Basculer pour définir un Tick d'exécution personnalisé", + "error": { + "required": "Le Tick est requis", + "min": "Le Tick doit être au minimum de {{currentTick}}" + } + } + }, + "buttons": { + "send": "Effectuer la transaction", + "reset": "Réinitialiser", + "loadPrivateKey": "Charger le fichier Wallet" + } + }, + "balanceComponent": { + "title": "Solde", + "createSeedHint": "Veuillez d'abord créer une Seed", + "overview": { + "title": "Vue d'ensemble", + "totalWalletValue": "Valeur fixe du Wallet", + "estimatedWalletValue": "Valeur estimée du Wallet", + "baseDate": "au" + }, + "transactions": { + "title": "Transactions de l'époque actuelle", + "verificationAlert": "Les données de l'aperçu n'ont pas pu être vérifiées", + "noTransactions": "Aucune transaction trouvée", + "send.tooltip": "Transfert sortant", + "exchange.tooltip": "Transfert interne", + "explorer.tooltip": "Afficher le transfert dans l'Explorateur", + "receive.tooltip": "Transfert entrant", + "status.pending.tooltip": "En attente", + "status.executed.tooltip": "Exécuté", + "status.dismissed.tooltip": "Rejeté", + "status.unknown.tooltip": "Inconnu", + "status.confirmed.tooltip": "Enregistré", + "filter.seed.label": "Filtrer par Seed" + }, + "repeatTransaction": "Répéter la transaction" + }, + "settings": { + "general": { + "tickAddition.placeholder": "Nombre de Ticks ajoutés au tick actuel pour envoyer une nouvelle transaction", + "webBridge.placeholder": "Activer le Web Bridge (Connexion directe au réseau QUBIC)", + "button.save": "Sauvegarder les paramètres", + "beta": { + "placeholder": "Enable Beta Features" + } + }, + "import": { + "title": "Importer les paramètres", + "doneMessage": "Importation réussie", + "dropMessage": "Déposez votre configuration ici pour l'importer", + "buttons.import": "Importer la configuration", + "seedsMessage": "Vous êtes sur le point d'importer {{amount}} Seed.", + "goHomeLink": "Afficher les Seed importées" + }, + "export": { + "title": "Exporter les paramètres", + "hint": "Appuyez sur le bouton ci-dessous pour télécharger votre configuration actuelle. Elle contient vos Seed cryptées. Vous devriez également avoir sauvegardé votre clé privée.", + "buttons.export": "Exporter/Sauvegarder la configuration" + } + }, + "votingComponent": { + "title": "Vote Computor Qubic", + "description": "Le vote computor Qubic est utilisé pour atteindre un consensus sur des sujets à décider concernant l'ensemble du réseau. Cela peut inclure l'acceptation de contrats intelligents ou la prise de décisions protocolaires. Seuls les computors sont autorisés à participer.", + "proposals": { + "editButton": "Modifier", + "createButton": "Créer une proposition", + "voteButton": "Voter", + "title": "{{amount}} Propositions actuelles", + "noComputorHint": "Vous n'avez enregistré aucun Computor. Si vous souhaitez proposer quelque chose, vous devez avoir au moins une Seed Computor.", + "votingResult": "Résultat du vote", + "noVotes": "aucun vote", + "from": "De :", + "url": "URL de la proposition :" + }, + "participate": { + "title": "Participer", + "cancelButton": "Annuler", + "sendVotesButton": "Envoyer les votes", + "notConfirmedMessage": "Cette proposition n'est pas encore confirmée par le réseau Qubic. Veuillez attendre pour voter.", + "noComputorsText": "Vous n'avez pas de Computors ou vos Computors ont déjà créé une proposition.", + "computorsSelected": "Computors sélectionnés" + }, + "create": { + "title": "Créer une proposition", + "cancelButton": "Annuler", + "sendVotesButton": "Envoyer la proposition", + "alreadyPublished": "Ce Computor a déjà publié une proposition. Une seule est autorisée par époque", + "buttons": { + "create": "Créer une proposition", + "publish": "Connecter et publier la proposition", + "reset": "Réinitialiser le formulaire", + "loadPrivateKey": "Charger le fichier Wallet", + "finish": "Afficher les propositions" + }, + "form": { + "operatorSeed.label": "Seed de l'opérateur", + "operatorSeed.error.required": "L'opérateur est requis", + "sourceSeed.label": "Computor à utiliser pour la proposition", + "sourceSeed.error.required": "Le computor est requis", + "title.label": "Titre de la proposition", + "title.placeholder": "Titre de la proposition", + "title.error.required": "Le titre est requis", + "title.error.min": "Le titre doit avoir au moins 2 caractères", + "title.error.max": "Le titre ne doit pas dépasser 100 caractères", + "description.label": "Description de la proposition", + "description.placeholder": "Description de la proposition", + "description.error.min": "La description doit avoir au moins 2 caractères", + "description.error.max": "La description ne doit pas dépasser 1000 caractères", + "description.error.required": "La description est requise", + "option.label": "Option {{id}}", + "option.placeholder": "Option {{id}}", + "option.error.required": "L'option {{id}} est requise", + "option.error.min": "L'option doit avoir au moins 2 caractères", + "option.error.max": "L'option ne doit pas dépasser 50 caractères", + "computorIp.label": "Adresse IP du computor", + "computorIp.placeholder": "Adresse IP du computor", + "computorIp.error.required": "L'adresse IP du computor est requise" + }, + "proposalStep.label": "Créer une proposition", + "publishStep.label": "Publier la proposition", + "finishStep.label": "Terminé", + "finishStep.success": "Votre proposition a été envoyée à votre computor." + }, + "status": { + "success": "Accepté par le quorum", + "failed": "Rejeté par le quorum", + "publishing": "Publication en cours", + "pending": "Vote ouvert", + "draft": "Brouillon", + "unknown": "Statut inconnu" + } + }, + "ipoComponent": { + "messages": { + "unlock": "Veuillez déverrouiller votre Wallet d'abord", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Votre IPO n'a pas pu être envoyée. Veuillez réessayer ultérieurement.", + "failedToDecrypt": "Nous n'avons pas pu déchiffrer votre Seed. Avez-vous utilisé la clé privée correcte ?", + "failedToValidate": "Nous avons rencontré des erreurs de validation. Veuillez vérifier le formulaire." + }, + "title": "Qubic IPO", + "description": "L'IPO Qubic est une enchère pour des parts de contrats intelligents.", + "noIpos": "Actuellement aucune IPO active", + "yourBids": "Vos Offres", + "yourShares": "Vos Actions", + "sharesFor": "Actions pour", + "statusValid": "Statut valide pour le tick {{tick}}", + "livPanelHint": "Consultez les Résultats Actuels", + "buttons.place-bid": "Placer une Offre", + "buttons.refresh": "Actualiser le Statut", + "bidStatus.hint": "Le statut s'affiche uniquement si votre offre a été placée. PAS si elle a été réussie.", + "bidStatus.pcs": "pcs", + "place-bid": { + "title": "Placer une Offre", + "needBalance": "Vous avez besoin d'au moins une Seed avec un solde positif.", + "noContract": "Contrat introuvable. Veuillez réessayer ultérieurement.", + "noContract.gotoIpoLabel": "Afficher les IPO de Contrats disponibles", + "buttons": { + "send": "Envoyer l'Offre" + }, + "form": { + "quantity": { + "placeholder": "Quantité", + "error.min": "Minimum 1", + "error.required": "La quantité est obligatoire" + }, + "price": { + "placeholder": "Prix (qus)", + "error.min": "Minimum 1", + "error.required": "Le prix est obligatoire", + "max.tooltip": "Offrir tous les qus disponibles" + } + } + } + }, + "okDialog": { + "title": "Remarque", + "button": "Oui, je confirme.", + "messages": { + "tresorText": "Avez-vous maintenant téléchargé votre fichier de coffre-fort ? Veuillez choisir ce fichier de coffre-fort à l'étape suivante pour ouvrir le portefeuille !" + } + }, + "loadConfigComponent": { + "title": "Importer des comptes", + "buttons": { + "import": "Importer", + "cancel": "Annuler" + }, + "messages": { + "import": "Si vous avez déjà un fichier .config contenant vos clés publiques, sélectionnez-le maintenant et importez-le.", + "noImport": "Si vous n'avez pas encore de fichier .config, créez un compte dans la section suivante." + } + }, + "exportConfigComponent": { + "title": "Exporter les comptes", + "buttons": { + "export": "Exporter", + "cancel": "Annuler" + }, + "messages": { + "export": "Vous avez modifié votre inventaire de comptes. Assurez-vous de télécharger votre configuration actuelle afin de pouvoir l'importer ultérieurement.", + "info": "Il contient vos seeds chiffrées.", + "unlockInfo": "Please unlock your Vault to be able to export your Vault file with the newest inventory." + } + }, + "welcomeComponent": { + "welcomeMessage": "To use this Wallet you must either create or import your existing Vault. This will contain your public/private key which afterwards is used to encrypt/decrypt your data.", + "button": { + "createVault": "Create Vault", + "importVault": "Import Vault" + }, + "title": "Welcome to the Qubic Wallet" + }, + "importComponent": { + "title": "Import Vault", + "message": "You can import an existing Vault to your Wallet." + }, + "createVaultComponent": { + "createVault": { + "message": "This step will create a private/public key pair for the wallet. Choose a name and select \"Create Vault\" to create your Qubic\r\n Wallet.", + "stepTitle": "Create Vault", + "vaultName": "Name", + "button": "Create Vault" + }, + "createAddress": { + "title": "Add Address", + "message": "In your Qubic Wallet you can have multiple Addresses. Every Address\r\n consists of a Seed (private Key) and a Public Id. The Seed is needed to\r\n send Qubic and the Public Id can be used to receive Qubic. We create now\r\n your first Address.", + "addressNam": "Name", + "seed": "Seed", + "seedPlaceholder": "Choose a random seed...", + "publicId": "Public Id", + "radomizeSeed": "Randomize Seed", + "addressPlaceholder": "Choose an Account Name", + "button": "Create Address" + }, + "downloadVault": { + "stepTitle": "Download initial Vault", + "message": "Your personal Vault has been created. You can now download it. Please\r\n choose a secure Password and select \"Download Vault\".", + "password": "Password", + "passwordHint": "Choose a secure password...", + "button": "Download Vault" + }, + "verifyVault": { + "stpTitle": "Load/Import Vault", + "message": "The Vault file which you have downloaded is the file which contains\r\n all important information. Everytime when you want to unlock your\r\n wallet, you will need this file. Everytime when you change your Wallet\r\n (e.g. add or edit an address) you will be prompted do download the\r\n newest Vault file. To Ensure this works for you. Please select below\r\n the downloaded Vault file and enter your Vault Password again.", + "password": "Password", + "passwordHint": "Your Vault Password", + "button": "Verify Vault File" + }, + "done": { + "stepTitle": "Done", + "message": "Happy Qubic! Your Wallet is ready.", + "button": "Open My Wallet" + }, + "buttons": { + "cancel": "Cancel", + "reset": "Reset" + } + } +} diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json new file mode 100644 index 0000000..ac8c697 --- /dev/null +++ b/src/assets/i18n/nl.json @@ -0,0 +1,546 @@ +{ + "general": { + "title": "Qubic - Wallet", + "comingSoon": "coming soon!", + "navigation": { + "home": "Dashboard", + "payment": "Betaling", + "balance": "Account Balans", + "settings": "Instellingen", + "voting": "Voting", + "ipo": "IPO", + "assets": "Assets" + }, + "version": "Versie {{version}} - preview", + "version.url": "qubic.li", + "copy.tooltip": "Copy", + "error": "Error", + "close": "sluiten", + "currency": "qus", + "currentTick": "Tick: {{tick}}", + "loading": "loading...", + "buttons": { + "close": "Close", + "maximize": "Maximize" + }, + "messages": { + "notConnected": "Not connected to the Qubic Network. Please Connect first.", + "refreshRequested": "Refresh has been requested", + "refreshFailed": "Refresh failed, please try again later", + "balanceReceived": "Network reported {{balance}} QUBIC for {{publicId}}.", + "timeoutTryAgain": "We run into a timeout. Please try again." + } + }, + "payment": { + "keyRequestReason": "Omdat transacties digitaal worden ondertekend met uw sleutel moet u eerst uw sleutel laden." + }, + "confirmDialog": { + "title": "Bevestig", + "buttons": { + "cancel": "Cancel", + "confirm": "Ja, ik bevestig" + }, + "confirmationText": "Weet u het zeker?" + }, + "notifyComponent": { + "saveYourSettings": "Please Export/Download your Settings. Your Settings Contains the Encrypted Seeds which you need to restore the Wallet.", + "saveYourKey": "Bewaar uw kluisbestand op een veilige plaats.", + "qubicLiSync": "Synchroniseer uw instellingen met qubic.li", + "qubicOffline": "QUBIC network not connected", + "qubicOnline": "Connected to the QUBIC network" + }, + "revealSeedComponent": { + "title": "Account Informatie", + "publicId": "Account ID", + "privateId": "Account Wachtwoord", + "buttons": { + "close": "Sluiten" + } + }, + "assetsComponent": { + "title": "Your Assets", + "openAssets": "Goto Asset Management", + "overview": { + "title": "Asset Overview" + }, + "table": { + "publicId": "Public ID", + "contractIndex": "Contract Index", + "assetName": "Asset Name", + "contractName": "Contract Name", + "ownedAmount": "Owned Amount", + "possessedAmount": "Possessed Amount", + "tick": "Valid for Tick {{tick}}", + "reportingNodes": "Reporting Nodes", + "issuerIdentity": "Issuer Identity" + }, + "buttons": { + "close": "Close", + "refresh": "Refresh", + "send": "Transfer Assets" + }, + "form": { + "info": "Send Assets form", + "fees": "Fixed sending fees: 1,000,000 Qubic", + "select": "Select Asset", + "select.error": "Asset selection is required", + "placeholder": "Address ID of the receiver", + "placeholder.error": "An 55-char seed is required.", + "amount": "Amount to send", + "amount.error": "Amount is required", + "amount.value.error": "The amount must be greater than 0", + "amount.max.error": "The amount cannot exceed the quantity held", + "tick": "Tick", + "tick.error": "Tick is required", + "tick.tooltip": "Tick is required", + "tick.min": "Tick must be a minimum of {{currentTick}}", + "buttons": { + "send": "Send", + "cancel": "Cancel", + "error.balance": "Insufficient balance, minimum balance is 1,000,000 Qubic" + } + }, + "noAssets": "No assets available" + }, + "qrReceiveComponent": { + "title": "Betaling ontvangen", + "downloadLink": "Download", + "hint": "Scan/verzend deze QR-code om een betaling te ontvangen voor {{publicId}}.", + "buttons.close": "Sluiten" + }, + "seedEditComponent": { + "title.add": "Account Toevoegen", + "title.edit": "Account Aanpassen", + "newSeedName": "Account-Naam", + "seedWarning": "This 55-Chars are your Qubic Private Key (Seed)! Save it anywhere!", + "form": { + "alias": { + "placeholder": "Kies een eigen naam voor uw account om deze sneller te kunnen herkennen.", + "error": { + "required": "Naam vereist", + "min": "Naam moet minimaal uit 3 karakters bestaan", + "max": "Naam mag maximaal 50 karakters hebben", + "regex": "Kan alleen {{regex}} bevatten." + } + }, + "seed": { + "placeholder": "Account wachtwoord", + "error": { + "required": "Een accountwachtwoord is vereist.", + "min": "Het accountwachtwoord moet exact bestaan uit 55 kleine letters.", + "max": "Het accountwachtwoord moet exact bestaan uit 55 kleine letters.", + "regex": "Kan alleen a-zA-Z0-9_- bevatten." + }, + "generateSeed": "Willekeurig een accountwachtwoord genereren." + }, + "watchOnlyAddress": { + "title": "Watch-Only-Address", + "placeholder": "60-char public-key", + "error": { + "required": "An 60-char public-key is required.", + "min": "The 60-char public-key must exactly consist of 60 upper case characters", + "max": "The 60-char public-key must exactly consist of 60 upper case characters", + "regex": "Can only contain A-Z" + } + }, + "error": { + "text": "Controleer het formulier.", + "close": "sluiten" + } + }, + "publicIdMessage": "Je account id is:", + "privateKeyWarning": "Let op! Uw kluisbestand is niet geladen. Zorg ervoor dat u het veilig heeft opgeborgen.", + "buttons": { + "cancel": "Cancel", + "create": "Account aanmaken", + "save": "Account opslaan" + } + }, + "seedOverviewComponent": { + "title": "Addresses", + "isTable": "Show table", + "addSeedButton": "Account Toevoegen", + "importButton": "Import", + "exportButton": "Export", + "search.label": "Zoeken", + "table": { + "alias": "Account Naam", + "publicId": "Account ID", + "balance": "Balans", + "epochChanges": "Epoch Veranderingen", + "noData": "Geen gegevens die overeenkomen met het filter \"{{q}}\"", + "actions": { + "title": "Acties", + "revealSeed": "Onthul account wachtwoord", + "assets": "Show Owned Assets", + "makePayment": "Doe een betaling", + "receivePayment": "Genereer een QR Code om een betaling te ontvangen.", + "editSeed": "Account aanpassen", + "deleteSeed": "Account verwijderen", + "refreshBalance": "Refresh Balance from Network" + } + }, + "hasPendingTransaction": "Transactions pending", + "marketPrice": "Price", + "marketSupply": "Supply", + "marketCap": "Marketcap", + "marketCurrency": "$" + }, + "dashboard": { + "title": "Dashboard", + "balance": "Wallet balance", + "currency": "Qu", + "totalBalance": "Your Total Balance" + }, + "unlockComponent": { + "title": "Wallet vrijgeven", + "title.new": "Maak een kluisbestand aan", + "welcomeMessage": "Welkom bij de qubic Wallet.� Om deze Wallet te gebruiken moet u een kluisbestand aanmaken. Deze zal uw publieke/prive sleutel bevatten die daarna wordt gebruikt om uw gegevens te versleutelen/decoderen.", + "reasonMessage": "Om uw portemonnee te ontgrendelen is uw kluisbestand nodig. Dit bestand wordt automatisch verwijderd zodra deze pagina opnieuw wordt geladen of gesloten.", + "choosePrivateKeyFile": "Kies een kluisbestand", + "chooseConfigFile": "Choose wallet config file", + "overwriteVault": "Het lijkt erop dat er al gegevens zijn opgeslagen in deze Browser. Wilt u deze echt overschrijven?", + "form": { + "file.error.required": "Kluisbestand verplicht", + "password.error.required": "Kluis wachtwoord verplicht", + "password.error.min": "Uw wachtwoord moet minimaal 8 tekens bevatten.", + "configFile": { + "error": { + "required": "Config file required" + } + } + }, + "buttons": { + "cancel": "Cancel", + "generateKey": "Maak een nieuwe kluis", + "importAndUnlock": "Import Vault and Unlock", + "unlock": "Ontgrendel wallet", + "existingUser": "Ik heb al een kluis", + "newUser": "Create Vault", + "closeWallet": "Sluit Wallet", + "importVault": "Import Vault" + }, + "welcomeHintMessage": "After you have downloaded your Vault file. You need to select the downloaded file and enter your password again. This will unlock your wallet." + }, + "lockIconComponent": { + "lock": "Vergrendel Wallet", + "unlock": "Ontgrendel Wallet" + }, + "lockComponent": { + "title": "Sluit Wallet?", + "forceDownload": { + "title": "Download kluis bestand", + "reason": "Wanneer u uw wallet vergrendelt, wordt uw kluisbestand automatisch verwijderd. Zonder dit kluisbestand kunnen er geen transacties worden gedaan. Wees u ervan bewust dat uw kluisbestand veilig is opgeslagen. Exporteer het opnieuw in geval van twijfel...", + "buttons": { + "allOk": "Ik heb mijn sleutel, bedankt." + } + }, + "reason": "Het is van het grootste belang om uw kluisbestand veilig op te slaan. Kies een sterk wachtwoord dat u niet zult vergeten en klik dan op \"save\".", + "warning": "Ik bevestig dat ik mijn kluisbestand heb opgeslagen.", + "password.placeholder": "Wachtwoord", + "password.required": "Wachtwoord verplicht", + "password.min": "Het wachtwoord moet minimaal 8 tekens bevatten.", + "buttons": { + "savePrivateKey": "Save kluisbestand", + "closeWallet": "Vergrendel Wallet", + "exportAndCloseWallet": "Export Vault file and Lock Wallet", + "enableExport": "Exporteer", + "cancel": "Cancel" + } + }, + "paymentComponent": { + "title": "Verstuur Qubic Units (qus).", + "messages": { + "pleaseUnlock": "Please unlock your Wallet first", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Your transaction could not be sent. Please try again later.", + "failedToDecrypt": "We were not able to decrypt your seed. Did you use the correct private key??", + "failedValidation": "We had validation errors. Please check the form." + }, + "form": { + "sourceSeed": { + "label": "Account warvan qus moeten worden verzonden", + "error": { + "required": "Account van de afzender is vereist" + } + }, + "receiver": { + "placeholder": "Account ID van de ontvanger", + "hint": "60 hoofdletters", + "chooseOwnSeed": "Kies een eigen Account ID", + "error": { + "required": "Account ID is vereist", + "length": "Een Qubic account ID bestaat uit 60 hoofdletters." + } + }, + "amount": { + "placeholder": "Bedrag in Qubic Unis (qus)", + "max.tooltip": "Stel in op het maximaal beschikbare bedrag op deze seed", + "error": { + "required": "Bedrag is vereist", + "min": "Bedrag moet minimaal 1 zijn" + } + }, + "tick": { + "placeholder": "Executie Tick", + "customize.tooltip": "Verander om een zelfgekozen tick te kiezen", + "error": { + "required": "Tick is vereist", + "min": "Tick moet minimaal {{currentTick}} zijn." + } + } + }, + "buttons": { + "send": "Transactie uitvoeren", + "reset": "Reset", + "loadPrivateKey": "Kluisbestand laden" + } + }, + "balanceComponent": { + "title": "Account Balans", + "createSeedHint": "Maak eerst een seed aan", + "overview": { + "title": "Overzicht", + "totalWalletValue": "Fixed Wallet Waarde", + "estimatedWalletValue": "Geschatte Wallet Waarde", + "baseDate": "per" + }, + "transactions": { + "title": "Transacties in huidige Epoch", + "verificationAlert": "Voorbeeldgegevens konden niet worden gecontroleerd", + "noTransactions": "Geen transacties gevonden", + "send.tooltip": "Uitgaande transacties", + "exchange.tooltip": "Internal Transfer", + "explorer.tooltip": "Show Transfer in Explorer", + "receive.tooltip": "Inkomende transacties", + "status.pending.tooltip": "In afwachting van", + "status.executed.tooltip": "Uitgevoerd", + "status.dismissed.tooltip": "Niet uitgevoerd", + "status.unknown.tooltip": "Onebekend", + "status.confirmed.tooltip": "Gecontroleerd", + "filter.seed.label": "Filter op Seed" + } + }, + "settings": { + "general": { + "tickAddition.placeholder": "Number of Ticks added to the current tick to send a new transaction", + "webBridge.placeholder": "Enable the Web Bridge (Direct Connection to the QUBIC Network)", + "button.save": "Save Settings", + "beta": { + "placeholder": "Enable Beta Features" + } + }, + "import": { + "title": "Import Settings", + "doneMessage": "Import Successful", + "dropMessage": "Drop your config to import here", + "buttons.import": "Import Config", + "seedsMessage": "You are about to import {{amount}} seeds.", + "goHomeLink": "Show imported Seeds" + }, + "export": { + "title": "Export Settings", + "hint": "Press the below button to download your current config. It contains your encrypted seeds. You also should have saved your private key.", + "buttons.export": "Export/Save Config" + } + }, + "votingComponent": { + "title": "Qubic Computor Voting", + "description": "The Qubic computor voting is used to reach a consensus on topics to be decided regarding the entire network. This can include accepting smart contracts or making other protocol decisions. Only computors are allowed to participate.", + "proposals": { + "editButton": "Edit", + "createButton": "Create Proposal", + "voteButton": "Vote", + "title": "{{amount}} Current Proposals", + "noComputorHint": "You don't have registered any Computor. If you want to propose anything, you need to have at least one Computor Seed.", + "votingResult": "Voting Result", + "noVotes": "no votes", + "from": "From:", + "url": "Propsal URL:" + }, + "participate": { + "title": "Participate", + "cancelButton": "Cancel", + "sendVotesButton": "Send Votes", + "notConfirmedMessage": "This Proposal is not yet confirmed by the Qubic Network. Please wait to vote.", + "noComputorsText": "You do not have Computors or your Computors already have created a proposal.", + "computorsSelected": "Computors selected" + }, + "create": { + "title": "Create Proposal", + "cancelButton": "Cancel", + "sendVotesButton": "Send Proposal", + "alreadyPublished": "This Computor has already a published Proposal. Only one is allowed per Epoch", + "buttons": { + "create": "Create Proposal", + "publish": "Connect and Publish Proposal", + "reset": "Reset Form", + "loadPrivateKey": "Load vault file", + "finish": "Show Proposals" + }, + "form": { + "operatorSeed.label": "Operator Seed", + "operatorSeed.error.required": "Operator is required", + "sourceSeed.label": "Computor to use for proposal", + "sourceSeed.error.required": "Computor is required", + "title.label": "Proposal Title", + "title.placeholder": "Proposal Title", + "title.error.required": "Title is required", + "title.error.min": "Title must have at least 2 characters", + "title.error.max": "Title must have at maximum 100 characters", + "description.label": "Proposal Description", + "description.placeholder": "Proposal Description", + "description.error.min": "Description must have at least 2 characters", + "description.error.max": "Description must have at maximum 1000 characters", + "description.error.required": "Description is required", + "option.label": "Option {{id}}", + "option.placeholder": "Option {{id}}", + "option.error.required": "Option {{id}} is required", + "option.error.min": "Option must have at least 2 characters", + "option.error.max": "Option must have at maximum 50 characters", + "computorIp.label": "Computor IP Address", + "computorIp.placeholder": "Computor IP Address", + "computorIp.error.required": "Computor IP Address required" + }, + "proposalStep.label": "Create Proposal", + "publishStep.label": "Publish Proposal", + "finishStep.label": "Done", + "finishStep.success": "Your Proposal has been sent to your computor." + }, + "status": { + "success": "Accepted by Quorum", + "failed": "Dismissed by Quorum", + "publishing": "Publish in progress", + "pending": "Voting is open", + "draft": "Draft", + "unknown": "Unknown status" + } + }, + "ipoComponent": { + "messages": { + "unlock": "Please unlock your Wallet first", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Your IPO could not be sent. Pleas try again later.", + "failedToDecrypt": "We were not able to decrypt your seed. Did you use the correct private key??", + "failedToValidate": "We had validation errors. Please check the form." + }, + "title": "Qubic IPO", + "description": "The Qubic IPO is an auction for shares of smart contracts.", + "noIpos": "Currently no IPO's active", + "yourBids": "Your Bids", + "yourShares": "Your Shares", + "sharesFor": "Shares for", + "statusValid": "Status valid for tick {{tick}}", + "livPanelHint": "Check out current Results", + "buttons.place-bid": "Place Bid", + "buttons.refresh": "Refresh Status", + "bidStatus.hint": "The status shows only if your bid has been placed. NOT if it was successful.", + "bidStatus.pcs": "pcs", + "place-bid": { + "title": "Place a Bid", + "needBalance": "You need at least one seed with a positive balance.", + "noContract": "Contract not found. Please try again later.", + "noContract.gotoIpoLabel": "Show available Contract IPO's", + "buttons": { + "send": "Send Bid" + }, + "form": { + "quantity": { + "placeholder": "Quantity", + "error.min": "Minimum 1", + "error.required": "Quantity is required" + }, + "price": { + "placeholder": "Price (qus)", + "error.min": "Minimum 1", + "error.required": "Price is required", + "max.tooltip": "Bid all available qus" + } + } + } + }, + "okDialog": { + "title": "Opmerking", + "button": "Ja, ik bevestig.", + "messages": { + "tresorText": "Heeft u nu uw kluisbestand gedownload? Kies dit kluisbestand in de volgende stap om de portemonnee te openen!" + } + }, + "loadConfigComponent": { + "title": "Accounts importeren", + "buttons": { + "import": "Importeren", + "cancel": "Annuleren" + }, + "messages": { + "import": "Als u al een .config-bestand heeft met uw openbare sleutels, selecteert u dit nu en importeert u het.", + "noImport": "Als u nog geen .config-bestand heeft, maakt u een account aan in het volgende gedeelte." + } + }, + "exportConfigComponent": { + "title": "Accounts exporteren", + "buttons": { + "export": "Exporteren", + "cancel": "Annuleren" + }, + "messages": { + "export": "Je hebt je accountvoorraad gewijzigd. Zorg ervoor dat je je huidige configuratie downloadt, zodat je deze later kunt importeren.", + "info": "Het bevat je versleutelde seeds.", + "unlockInfo": "Please unlock your Vault to be able to export your Vault file with the newest inventory." + } + }, + "welcomeComponent": { + "welcomeMessage": "To use this Wallet you must either create or import your existing Vault. This will contain your public/private key which afterwards is used to encrypt/decrypt your data.", + "button": { + "createVault": "Create Vault", + "importVault": "Import Vault" + }, + "title": "Welcome to the Qubic Wallet" + }, + "importComponent": { + "title": "Import Vault", + "message": "You can import an existing Vault to your Wallet." + }, + "createVaultComponent": { + "createVault": { + "message": "This step will create a private/public key pair for the wallet. Choose a name and select \"Create Vault\" to create your Qubic\r\n Wallet.", + "stepTitle": "Create Vault", + "vaultName": "Name", + "button": "Create Vault" + }, + "createAddress": { + "title": "Add Address", + "message": "In your Qubic Wallet you can have multiple Addresses. Every Address\r\n consists of a Seed (private Key) and a Public Id. The Seed is needed to\r\n send Qubic and the Public Id can be used to receive Qubic. We create now\r\n your first Address.", + "addressNam": "Name", + "seed": "Seed", + "seedPlaceholder": "Choose a random seed...", + "publicId": "Public Id", + "radomizeSeed": "Randomize Seed", + "addressPlaceholder": "Choose an Account Name", + "button": "Create Address" + }, + "downloadVault": { + "stepTitle": "Download initial Vault", + "message": "Your personal Vault has been created. You can now download it. Please\r\n choose a secure Password and select \"Download Vault\".", + "password": "Password", + "passwordHint": "Choose a secure password...", + "button": "Download Vault" + }, + "verifyVault": { + "stpTitle": "Load/Import Vault", + "message": "The Vault file which you have downloaded is the file which contains\r\n all important information. Everytime when you want to unlock your\r\n wallet, you will need this file. Everytime when you change your Wallet\r\n (e.g. add or edit an address) you will be prompted do download the\r\n newest Vault file. To Ensure this works for you. Please select below\r\n the downloaded Vault file and enter your Vault Password again.", + "password": "Password", + "passwordHint": "Your Vault Password", + "button": "Verify Vault File" + }, + "done": { + "stepTitle": "Done", + "message": "Happy Qubic! Your Wallet is ready.", + "button": "Open My Wallet" + }, + "buttons": { + "cancel": "Cancel", + "reset": "Reset" + } + } +} diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json new file mode 100644 index 0000000..55d9b6a --- /dev/null +++ b/src/assets/i18n/pt.json @@ -0,0 +1,546 @@ +{ + "general": { + "title": "Qubic - Wallet", + "comingSoon": "Em breve!", + "navigation": { + "home": "Dashboard", + "payment": "Pagamento", + "balance": "Saldo", + "settings": "Configurações", + "voting": "Votação", + "ipo": "IPO", + "assets": "Assets" + }, + "version": "Versão {{version}} - beta", + "version.url": "qubic.li", + "copy.tooltip": "Copiar", + "error": "Erro", + "close": "Fechar", + "currency": "QUBIC", + "currentTick": "Tick: {{tick}}", + "loading": "Carregando...", + "buttons": { + "close": "Fechar", + "maximize": "Maximizar" + }, + "messages": { + "notConnected": "Não conectado à rede Qubic. Por favor, conecte-se.", + "refreshRequested": "Atualização solicitada", + "refreshFailed": "Falha na atualização, por favor, tente novamente mais tarde", + "balanceReceived": "A rede indica um saldo de {{balance}} QUBIC para {{publicId}}.", + "timeoutTryAgain": "We run into a timeout. Please try again." + } + }, + "payment": { + "keyRequestReason": "Como as transações são assinadas digitalmente com sua chave, você precisa carregá-la primeiro." + }, + "confirmDialog": { + "title": "Confirmar", + "buttons": { + "cancel": "Cancelar", + "confirm": "Sim, eu confirmo" + }, + "confirmationText": "Você tem certeza?" + }, + "notifyComponent": { + "saveYourSettings": "Por favor, exporte/faça o download de suas configurações. Suas configurações contêm as Seeds criptografadas necessárias para restaurar a Wallet.", + "saveYourKey": "Por favor, armazene seu arquivo Wallet em um local seguro.", + "qubicLiSync": "Sincronize suas configurações com qubic.li", + "qubicOffline": "Rede QUBIC desconectada", + "qubicOnline": "Conectado à rede QUBIC" + }, + "revealSeedComponent": { + "title": "Informações de Endereço", + "publicId": "ID de Endereço", + "privateId": "Seed de 55 caracteres", + "buttons": { + "close": "Fechar" + } + }, + "assetsComponent": { + "title": "Your Assets", + "openAssets": "Goto Asset Management", + "overview": { + "title": "Asset Overview" + }, + "table": { + "publicId": "Public ID", + "contractIndex": "Contract Index", + "assetName": "Asset Name", + "contractName": "Contract Name", + "ownedAmount": "Owned Amount", + "possessedAmount": "Possessed Amount", + "tick": "Valid for Tick {{tick}}", + "reportingNodes": "Reporting Nodes", + "issuerIdentity": "Issuer Identity" + }, + "buttons": { + "close": "Close", + "refresh": "Refresh", + "send": "Transfer Assets" + }, + "form": { + "info": "Send Assets form", + "fees": "Fixed sending fees: 1,000,000 Qubic", + "select": "Select Asset", + "select.error": "Asset selection is required", + "placeholder": "Address ID of the receiver", + "placeholder.error": "An 55-char seed is required.", + "amount": "Amount to send", + "amount.error": "Amount is required", + "amount.value.error": "The amount must be greater than 0", + "amount.max.error": "The amount cannot exceed the quantity held", + "tick": "Tick", + "tick.error": "Tick is required", + "tick.tooltip": "Tick is required", + "tick.min": "Tick must be a minimum of {{currentTick}}", + "buttons": { + "send": "Send", + "cancel": "Cancel", + "error.balance": "Insufficient balance, minimum balance is 1,000,000 Qubic" + } + }, + "noAssets": "No assets available" + }, + "qrReceiveComponent": { + "title": "Receber um Pagamento", + "downloadLink": "Baixar", + "hint": "Escanee/envie este QR Code para receber um pagamento para {{publicId}}.", + "buttons.close": "Fechar" + }, + "seedEditComponent": { + "title.add": "Adicionar um Endereço", + "title.edit": "Editar um Endereço", + "newSeedName": "Nome de Endereço", + "seedWarning": "Esses 55 caracteres são sua chave privada Qubic (Seed)! Faça backup dela em algum lugar seguro!", + "form": { + "alias": { + "placeholder": "Escolha um nome único para o seu endereço para referência mais fácil.", + "error": { + "required": "Nome necessário", + "min": "O nome deve ter pelo menos 3 caracteres", + "max": "O nome não pode exceder 50 caracteres", + "regex": "Pode conter apenas {{regex}}" + } + }, + "seed": { + "placeholder": "Seed de 55 caracteres", + "error": { + "required": "Uma Seed de 55 caracteres é necessária.", + "min": "A Seed de 55 caracteres deve ser composta exatamente por 55 caracteres minúsculos", + "max": "A Seed de 55 caracteres deve ser composta exatamente por 55 caracteres minúsculos", + "regex": "Pode conter apenas a-zA-Z0-9_-" + }, + "generateSeed": "Gerar aleatoriamente uma Seed de 55 caracteres." + }, + "watchOnlyAddress": { + "title": "Watch-Only-Address", + "placeholder": "60-char public-key", + "error": { + "required": "An 60-char public-key is required.", + "min": "The 60-char public-key must exactly consist of 60 upper case characters", + "max": "The 60-char public-key must exactly consist of 60 upper case characters", + "regex": "Can only contain A-Z" + } + }, + "error": { + "text": "Por favor, verifique o formulário.", + "close": "Fechar" + } + }, + "publicIdMessage": "Seu ID de endereço é:", + "privateKeyWarning": "Atenção! Seu arquivo Wallet não está carregado. Certifique-se de tê-lo salvo com segurança.", + "buttons": { + "cancel": "Cancelar", + "create": "Criar um endereço", + "save": "Salvar endereço" + } + }, + "seedOverviewComponent": { + "title": "Addresses", + "isTable": "Show table", + "addSeedButton": "Adicionar um Endereço", + "importButton": "Importar", + "exportButton": "Exportar", + "search.label": "Pesquisar", + "table": { + "alias": "Nome de Endereço", + "publicId": "ID de Endereço", + "balance": "Saldo", + "epochChanges": "Mudanças de Época", + "noData": "Nenhum dado correspondente ao filtro \"{{q}}\"", + "actions": { + "title": "Ações", + "revealSeed": "Revelar a Seed de 55 caracteres", + "assets": "Mostrar ativos possuídos", + "makePayment": "Realizar um pagamento", + "receivePayment": "Gerar um QR Code para receber um pagamento", + "editSeed": "Editar endereço", + "deleteSeed": "Excluir endereço", + "refreshBalance": "Atualizar saldo da rede" + } + }, + "hasPendingTransaction": "Transações pendentes", + "marketPrice": "Price", + "marketSupply": "Supply", + "marketCap": "Marketcap", + "marketCurrency": "$" + }, + "dashboard": { + "title": "Dashboard", + "balance": "Wallet balance", + "currency": "Qu", + "totalBalance": "Your Total Balance" + }, + "unlockComponent": { + "title": "Desbloquear a Wallet", + "title.new": "Criar uma Wallet", + "welcomeMessage": "Bem-vindo à Wallet qubic.li.\nPara usar esta Wallet, você precisa criar um arquivo Wallet. Ele conterá sua chave pública/privada que será usada para criptografar/descriptografar seus dados.", + "reasonMessage": "Para desbloquear sua Wallet, seu arquivo Wallet é necessário. Este arquivo é automaticamente excluído quando esta página é recarregada ou fechada.", + "choosePrivateKeyFile": "Escolher o arquivo Wallet", + "chooseConfigFile": "Choose wallet config file", + "overwriteVault": "Parece que já existem dados armazenados neste navegador. Você realmente deseja sobrescrevê-los?", + "form": { + "file.error.required": "Arquivo Wallet necessário", + "password.error.required": "Senha Wallet necessária", + "password.error.min": "Sua senha deve ter pelo menos 8 caracteres.", + "configFile": { + "error": { + "required": "Config file required" + } + } + }, + "buttons": { + "cancel": "Cancelar", + "generateKey": "Criar uma nova Wallet", + "importAndUnlock": "Import Vault and Unlock", + "unlock": "Desbloquear a Wallet", + "existingUser": "Já tenho uma Wallet", + "newUser": "Create Vault", + "closeWallet": "Fechar a Wallet", + "importVault": "Import Vault" + }, + "welcomeHintMessage": "After you have downloaded your Vault file. You need to select the downloaded file and enter your password again. This will unlock your wallet." + }, + "lockIconComponent": { + "lock": "Trancar a Wallet", + "unlock": "Desbloquear a Wallet" + }, + "lockComponent": { + "title": "Fechar a Wallet?", + "forceDownload": { + "title": "Baixar o arquivo Wallet", + "reason": "Quando você tranca sua Wallet, seu arquivo Wallet é automaticamente excluído. Sem este arquivo Wallet, nenhuma transação pode ser feita. Certifique-se de que seu arquivo Wallet esteja salvo com segurança. Exporte-o novamente se houver dúvidas...", + "buttons": { + "allOk": "Eu tenho meu arquivo de desbloqueio, obrigado" + } + }, + "reason": "É essencial armazenar seu arquivo Wallet com segurança. Por favor, escolha uma senha forte que você não esquecerá e clique em \"salvar\".", + "warning": "Eu confirmo que salvei meu arquivo Wallet.", + "password.placeholder": "Senha", + "password.required": "Senha necessária", + "password.min": "A senha deve ter pelo menos 8 caracteres.", + "buttons": { + "savePrivateKey": "Salvar o arquivo Wallet", + "closeWallet": "Trancar a Wallet", + "enableExport": "Exportar", + "cancel": "Cancelar" + } + }, + "paymentComponent": { + "title": "Enviar unidades Qubic (qus)", + "messages": { + "pleaseUnlock": "Por favor, desbloqueie sua Wallet primeiro", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Sua transação não pôde ser enviada. Por favor, tente novamente mais tarde.", + "failedToDecrypt": "Não conseguimos descriptografar sua Seed. Você usou a chave privada correta?", + "failedValidation": "Enfrentamos erros de validação. Por favor, verifique o formulário." + }, + "form": { + "sourceSeed": { + "label": "Endereço de onde os qus serão enviados", + "error": { + "required": "O endereço do remetente é obrigatório" + } + }, + "receiver": { + "placeholder": "ID do destinatário", + "hint": "60 caracteres maiúsculos", + "chooseOwnSeed": "Escolher sua própria ID de endereço", + "error": { + "required": "O ID do endereço é obrigatório", + "length": "Um ID de endereço Qubic consiste em 60 letras maiúsculas." + } + }, + "amount": { + "placeholder": "Quantidade em unidades Qubic (qus)", + "max.tooltip": "Definir para a quantidade máxima disponível para esta Seed", + "error": { + "required": "A quantidade é obrigatória", + "min": "A quantidade deve ser no mínimo 1" + } + }, + "tick": { + "placeholder": "Tick de execução", + "customize.tooltip": "Alternar para definir um Tick de execução personalizado", + "error": { + "required": "O Tick é obrigatório", + "min": "O Tick deve ser no mínimo {{currentTick}}" + } + } + }, + "buttons": { + "send": "Realizar a transação", + "reset": "Redefinir", + "loadPrivateKey": "Carregar o arquivo Wallet" + } + }, + "balanceComponent": { + "title": "Saldo", + "createSeedHint": "Por favor, crie primeiro uma Seed", + "overview": { + "title": "Visão geral", + "totalWalletValue": "Valor total da Wallet", + "estimatedWalletValue": "Valor estimado da Wallet", + "baseDate": "em" + }, + "transactions": { + "title": "Transações da época atual", + "verificationAlert": "Os dados da visualização não puderam ser verificados", + "noTransactions": "Nenhuma transação encontrada", + "send.tooltip": "Transferência de saída", + "exchange.tooltip": "Transferência interna", + "explorer.tooltip": "Ver transação no Explorador", + "receive.tooltip": "Transferência de entrada", + "status.pending.tooltip": "Pendente", + "status.executed.tooltip": "Executada", + "status.dismissed.tooltip": "Rejeitada", + "status.unknown.tooltip": "Desconhecida", + "status.confirmed.tooltip": "Registrada", + "filter.seed.label": "Filtrar por Seed" + }, + "repeatTransaction": "Repetir a transação" + }, + "settings": { + "general": { + "tickAddition.placeholder": "Número de Ticks adicionados ao Tick atual para enviar uma nova transação", + "webBridge.placeholder": "Ativar a Web Bridge (Conexão direta à rede QUBIC)", + "button.save": "Salvar configurações", + "beta": { + "placeholder": "Enable Beta Features" + } + }, + "import": { + "title": "Importar configurações", + "doneMessage": "Importação bem-sucedida", + "dropMessage": "Solte sua configuração aqui para importá-la", + "buttons.import": "Importar configuração", + "seedsMessage": "Você está prestes a importar {{amount}} Seed.", + "goHomeLink": "Visualizar Seeds importadas" + }, + "export": { + "title": "Exportar configurações", + "hint": "Pressione o botão abaixo para baixar sua configuração atual. Ela contém suas Seeds criptografadas. Você também deve ter feito backup de sua chave privada.", + "buttons.export": "Exportar/Fazer backup da configuração" + } + }, + "votingComponent": { + "title": "Votação Computor Qubic", + "description": "A votação Computor Qubic é usada para alcançar consenso em assuntos a serem decididos em toda a rede. Isso pode incluir a aceitação de contratos inteligentes ou decisões de protocolo. Somente computadores são autorizados a participar.", + "proposals": { + "editButton": "Editar", + "createButton": "Criar uma proposta", + "voteButton": "Votar", + "title": "{{amount}} Propostas atuais", + "noComputorHint": "Você não registrou nenhum Computor. Se desejar fazer uma proposta, você deve ter pelo menos uma Seed de Computor.", + "votingResult": "Resultado da votação", + "noVotes": "nenhum voto", + "from": "De:", + "url": "URL da proposta:" + }, + "participate": { + "title": "Participar", + "cancelButton": "Cancelar", + "sendVotesButton": "Enviar votos", + "notConfirmedMessage": "Esta proposta ainda não foi confirmada pela rede Qubic. Por favor, aguarde para votar.", + "noComputorsText": "Você não tem Computors ou seus Computors já fizeram uma proposta.", + "computorsSelected": "Computors selecionados" + }, + "create": { + "title": "Criar uma proposta", + "cancelButton": "Cancelar", + "sendVotesButton": "Enviar proposta", + "alreadyPublished": "Este Computor já publicou uma proposta. Apenas uma é permitida por época", + "buttons": { + "create": "Criar proposta", + "publish": "Conectar e publicar proposta", + "reset": "Redefinir formulário", + "loadPrivateKey": "Carregar o arquivo Wallet", + "finish": "Visualizar propostas" + }, + "form": { + "operatorSeed.label": "Seed do operador", + "operatorSeed.error.required": "O operador é obrigatório", + "sourceSeed.label": "Computor a ser usado para a proposta", + "sourceSeed.error.required": "O computor é obrigatório", + "title.label": "Título da proposta", + "title.placeholder": "Título da proposta", + "title.error.required": "O título é obrigatório", + "title.error.min": "O título deve ter pelo menos 2 caracteres", + "title.error.max": "O título não deve exceder 100 caracteres", + "description.label": "Descrição da proposta", + "description.placeholder": "Descrição da proposta", + "description.error.min": "A descrição deve ter pelo menos 2 caracteres", + "description.error.max": "A descrição não deve exceder 1000 caracteres", + "description.error.required": "A descrição é obrigatória", + "option.label": "Opção {{id}}", + "option.placeholder": "Opção {{id}}", + "option.error.required": "A opção {{id}} é obrigatória", + "option.error.min": "A opção deve ter pelo menos 2 caracteres", + "option.error.max": "A opção não deve exceder 50 caracteres", + "computorIp.label": "Endereço IP do computor", + "computorIp.placeholder": "Endereço IP do computor", + "computorIp.error.required": "O endereço IP do computor é obrigatório" + }, + "proposalStep.label": "Criar proposta", + "publishStep.label": "Publicar proposta", + "finishStep.label": "Concluído", + "finishStep.success": "Sua proposta foi enviada para o seu computor." + }, + "status": { + "success": "Aceito pelo quorum", + "failed": "Rejeitado pelo quorum", + "publishing": "Publicação em andamento", + "pending": "Voto em aberto", + "draft": "Rascunho", + "unknown": "Status desconhecido" + } + }, + "ipoComponent": { + "messages": { + "unlock": "Por favor, desbloqueie sua Wallet primeiro", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Seu IPO não pôde ser enviado. Por favor, tente novamente mais tarde.", + "failedToDecrypt": "Não conseguimos descriptografar sua Seed. Você usou a chave privada correta?", + "failedToValidate": "Enfrentamos erros de validação. Por favor, verifique o formulário." + }, + "title": "Qubic IPO", + "description": "O Qubic IPO é um leilão para ações de contratos inteligentes.", + "noIpos": "Atualmente, nenhum IPO ativo", + "yourBids": "Seus Lances", + "yourShares": "Suas Ações", + "sharesFor": "Ações para", + "statusValid": "Status válido para o tick {{tick}}", + "livPanelHint": "Ver resultados atuais", + "buttons.place-bid": "Colocar um Lance", + "buttons.refresh": "Atualizar Status", + "bidStatus.hint": "O status é exibido apenas se o seu lance foi colocado. NÃO se foi bem-sucedido.", + "bidStatus.pcs": "pcs", + "place-bid": { + "title": "Colocar um Lance", + "needBalance": "Você precisa ter pelo menos uma Seed com saldo positivo.", + "noContract": "Contrato não encontrado. Por favor, tente novamente mais tarde.", + "noContract.gotoIpoLabel": "Ver IPOs de Contratos disponíveis", + "buttons": { + "send": "Enviar Lance" + }, + "form": { + "quantity": { + "placeholder": "Quantidade", + "error.min": "Mínimo 1", + "error.required": "A quantidade é obrigatória" + }, + "price": { + "placeholder": "Preço (qus)", + "error.min": "Mínimo 1", + "error.required": "O preço é obrigatório", + "max.tooltip": "Oferecer todos os qus disponíveis" + } + } + } + }, + "okDialog": { + "title": "Nota", + "button": "Sim, eu confirmo.", + "messages": { + "tresorText": "Você baixou agora seu arquivo de cofre? Por favor, escolha este arquivo de cofre na próxima etapa para abrir a carteira!" + } + }, + "loadConfigComponent": { + "title": "Importar contas", + "buttons": { + "import": "Importar", + "cancel": "Cancelar" + }, + "messages": { + "import": "Se você já tem um arquivo .config contendo suas chaves públicas, selecione-o agora e importe-o.", + "noImport": "Se você ainda não tem um arquivo .config, crie uma conta na próxima seção." + } + }, + "exportConfigComponent": { + "title": "Exportar contas", + "buttons": { + "export": "Exportar", + "cancel": "Cancelar" + }, + "messages": { + "export": "Você modificou seu inventário de contas. Certifique-se de baixar sua configuração atual para poder importá-la posteriormente.", + "info": "Ele contém suas seeds criptografadas.", + "unlockInfo": "Please unlock your Vault to be able to export your Vault file with the newest inventory." + } + }, + "welcomeComponent": { + "welcomeMessage": "To use this Wallet you must either create or import your existing Vault. This will contain your public/private key which afterwards is used to encrypt/decrypt your data.", + "button": { + "createVault": "Create Vault", + "importVault": "Import Vault" + }, + "title": "Welcome to the Qubic Wallet" + }, + "importComponent": { + "title": "Import Vault", + "message": "You can import an existing Vault to your Wallet." + }, + "createVaultComponent": { + "createVault": { + "message": "This step will create a private/public key pair for the wallet. Choose a name and select \"Create Vault\" to create your Qubic\r\n Wallet.", + "stepTitle": "Create Vault", + "vaultName": "Name", + "button": "Create Vault" + }, + "createAddress": { + "title": "Add Address", + "message": "In your Qubic Wallet you can have multiple Addresses. Every Address\r\n consists of a Seed (private Key) and a Public Id. The Seed is needed to\r\n send Qubic and the Public Id can be used to receive Qubic. We create now\r\n your first Address.", + "addressNam": "Name", + "seed": "Seed", + "seedPlaceholder": "Choose a random seed...", + "publicId": "Public Id", + "radomizeSeed": "Randomize Seed", + "addressPlaceholder": "Choose an Account Name", + "button": "Create Address" + }, + "downloadVault": { + "stepTitle": "Download initial Vault", + "message": "Your personal Vault has been created. You can now download it. Please\r\n choose a secure Password and select \"Download Vault\".", + "password": "Password", + "passwordHint": "Choose a secure password...", + "button": "Download Vault" + }, + "verifyVault": { + "stpTitle": "Load/Import Vault", + "message": "The Vault file which you have downloaded is the file which contains\r\n all important information. Everytime when you want to unlock your\r\n wallet, you will need this file. Everytime when you change your Wallet\r\n (e.g. add or edit an address) you will be prompted do download the\r\n newest Vault file. To Ensure this works for you. Please select below\r\n the downloaded Vault file and enter your Vault Password again.", + "password": "Password", + "passwordHint": "Your Vault Password", + "button": "Verify Vault File" + }, + "done": { + "stepTitle": "Done", + "message": "Happy Qubic! Your Wallet is ready.", + "button": "Open My Wallet" + }, + "buttons": { + "cancel": "Cancel", + "reset": "Reset" + } + } +} diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json new file mode 100644 index 0000000..cd3fdd9 --- /dev/null +++ b/src/assets/i18n/ru.json @@ -0,0 +1,548 @@ +{ + "general": { + "title": "Qubic - Кошелек", + "comingSoon": "В разработке!", + "navigation": { + "home": "Домашняя страница", + "payment": "Платежи", + "balance": "Баланс", + "settings": "Настройки", + "voting": "Voting", + "ipo": "IPO", + "assets": "Assets" + }, + "version": "Версия {{version}} - тестовая", + "version.url": "qubic.li", + "copy.tooltip": "Копировать", + "error": "Ошибка", + "close": "Закрыть", + "currency": "qus", + "currentTick": "Tick: {{tick}}", + "loading": "loading...", + "buttons": { + "close": "Close", + "maximize": "Maximize" + }, + "messages": { + "notConnected": "Not connected to the Qubic Network. Please Connect first.", + "refreshRequested": "Refresh has been requested", + "refreshFailed": "Refresh failed, please try again later", + "balanceReceived": "Network reported {{balance}} QUBIC for {{publicId}}.", + "timeoutTryAgain": "We run into a timeout. Please try again." + } + }, + "payment": { + "keyRequestReason": "Поскольку транзакции подписываются цифровым ключом, вам необходимо сначала загрузить свой ключ." + }, + "confirmDialog": { + "title": "Подтверждение", + "buttons": { + "cancel": "Отменить", + "confirm": "Подтвердить" + }, + "confirmationText": "Вы уверены?" + }, + "notifyComponent": { + "saveYourSettings": "Please Export/Download your Settings. Your Settings Contains the Encrypted Seeds which you need to restore the Wallet.", + "saveYourKey": "Пожалуйста, сохраните ваш файл Vault в надежном месте", + "qubicLiSync": "Синхронизируйте свои настройки с qubic.li", + "qubicOffline": "QUBIC network not connected", + "qubicOnline": "Connected to the QUBIC network" + }, + "revealSeedComponent": { + "title": "Информация о счете", + "publicId": "ID счета", + "privateId": "Пароль счета", + "buttons": { + "close": "Закрыть" + } + }, + "assetsComponent": { + "title": "Your Assets", + "openAssets": "Goto Asset Management", + "overview": { + "title": "Asset Overview" + }, + "table": { + "publicId": "Public ID", + "contractIndex": "Contract Index", + "assetName": "Asset Name", + "contractName": "Contract Name", + "ownedAmount": "Owned Amount", + "possessedAmount": "Possessed Amount", + "tick": "Valid for Tick {{tick}}", + "reportingNodes": "Reporting Nodes", + "issuerIdentity": "Issuer Identity" + }, + "buttons": { + "close": "Close", + "refresh": "Refresh", + "send": "Transfer Assets" + }, + "form": { + "info": "Send Assets form", + "fees": "Fixed sending fees: 1,000,000 Qubic", + "select": "Select Asset", + "select.error": "Asset selection is required", + "placeholder": "Address ID of the receiver", + "placeholder.error": "An 55-char seed is required.", + "amount": "Amount to send", + "amount.error": "Amount is required", + "amount.value.error": "The amount must be greater than 0", + "amount.max.error": "The amount cannot exceed the quantity held", + "tick": "Tick", + "tick.error": "Tick is required", + "tick.tooltip": "Tick is required", + "tick.min": "Tick must be a minimum of {{currentTick}}", + "buttons": { + "send": "Send", + "cancel": "Cancel", + "error.balance": "Insufficient balance, minimum balance is 1,000,000 Qubic" + } + }, + "noAssets": "No assets available" + }, + "qrReceiveComponent": { + "title": "Получить платеж", + "downloadLink": "Загрузить", + "hint": "Отсканируйте/отправьте этот QR-код, для получения оплаты на {{publicId}}", + "buttons.close": "Закрыть" + }, + "seedEditComponent": { + "title.add": "Добавить аккаунт", + "title.edit": "Редактировать аккаунт", + "newSeedName": "Имя счета", + "seedWarning": "This 55-Chars are your Qubic Private Key (Seed)! Save it anywhere!", + "form": { + "alias": { + "placeholder": "Выберите имя для вашей учетной записи", + "error": { + "required": "Имя обязательно", + "min": "Имя должно содержать минимум 3 символа", + "max": "Имя должно содержать максимум 50 символов", + "regex": "Может содержать только {{regex}}" + } + }, + "seed": { + "placeholder": "Пароль учетной записи", + "error": { + "required": "Требуется пароль учетной записи", + "min": "Пароль учетной записи должен точно состоять из 55 символов нижнего регистра", + "max": "Пароль учетной записи должен состоять из 55 символов нижнего регистра", + "regex": "Может содержать только a-zA-Z0-9_-" + }, + "generateSeed": "Случайная генерация пароля учетной записи" + }, + "watchOnlyAddress": { + "title": "Watch-Only-Address", + "placeholder": "60-char public-key", + "error": { + "required": "An 60-char public-key is required.", + "min": "The 60-char public-key must exactly consist of 60 upper case characters", + "max": "The 60-char public-key must exactly consist of 60 upper case characters", + "regex": "Can only contain A-Z" + } + }, + "error": { + "text": "Пожалуйста, проверьте форму", + "close": "Закрыть" + } + }, + "publicIdMessage": "Ваш ID:", + "privateKeyWarning": "Внимание! Ваш файл Vault не загружен. Пожалуйста, убедитесь, что он надежно сохранен.", + "buttons": { + "cancel": "Отмена", + "create": "Создать аккаунт", + "save": "Сохранить счет" + } + }, + "seedOverviewComponent": { + "title": "Addresses", + "isTable": "Show table", + "addSeedButton": "Добавить счет", + "importButton": "Импортировать", + "exportButton": "Экспорт", + "search.label": "Search", + "table": { + "alias": "Имя счета", + "publicId": "ID счета", + "balance": "Баланс", + "epochChanges": "Epoch Changes", + "noData": "No data matching the filter \"{{q}}\"", + "actions": { + "title": "Действия", + "revealSeed": "Раскрыть пароль счета", + "assets": "Show Owned Assets", + "makePayment": "Произвести платеж", + "receivePayment": "Сгенерировать QR-код для получения платежа", + "editSeed": "Редактировать счет", + "deleteSeed": "Удалить аккаунт", + "refreshBalance": "Refresh Balance from Network" + } + }, + "hasPendingTransaction": "Transactions pending", + "marketPrice": "Price", + "marketSupply": "Supply", + "marketCap": "Marketcap", + "marketCurrency": "$" + }, + "dashboard": { + "title": "Dashboard", + "balance": "Wallet balance", + "currency": "Qu", + "totalBalance": "Your Total Balance" + }, + "unlockComponent": { + "title": "Разблокировать кошелек", + "title.new": "Создать файл Vault", + "welcomeMessage": "Добро пожаловать в кошелек qubic. Для использования этого кошелька вы должны создать файл Vault. Он будет содержать ваш открытый/закрытый ключ, который впоследствии будет использоваться для шифрования/дешифрования ваших данных.", + "reasonMessage": "Для разблокировки кошелька необходим файл Vault. Этот файл автоматически удаляется после перезагрузки или закрытия страницы.", + "choosePrivateKeyFile": "Выберите файл Vault", + "chooseConfigFile": "Choose wallet config file", + "overwriteVault": "Похоже, что в этом браузере уже сохранены некоторые данные. Вы действительно хотите перезаписать их?", + "form": { + "file.error.required": "Требуется файл Vault", + "password.error.required": "Требуется пароль к файлу Vault", + "password.error.min": "Ваш пароль должен состоять минимум из 8 символов.", + "configFile": { + "error": { + "required": "Config file required" + } + } + }, + "buttons": { + "cancel": "Отмена", + "generateKey": "Создать новый файл Vault", + "importAndUnlock": "Import Vault and Unlock", + "unlock": "Разблокировать кошелек", + "existingUser": "У меня уже есть мой Vault", + "newUser": "Create Vault", + "closeWallet": "Закрыть кошелек", + "importVault": "Import Vault" + }, + "welcomeHintMessage": "After you have downloaded your Vault file. You need to select the downloaded file and enter your password again. This will unlock your wallet." + }, + "lockIconComponent": { + "lock": "Заблокировать кошелек", + "unlock": "Разблокировать кошелек" + }, + "lockComponent": { + "title": "Закрыть кошелек?", + "forceDownload": { + "title": "Загрузить файл хранилища", + "reason": "При блокировке кошелька файл Vault автоматически удаляется. Без файла Vault транзакции невозможны. Пожалуйста, убедитесь, что ваш файл Vault надежно сохранен. Экспортируйте его снова в случае каких-либо сомнений...", + "buttons": { + "allOk": "У меня есть мой ключ" + } + }, + "reason": "Очень важно хранить ваш файл Vault в безопасности. Пожалуйста, выберите надежный пароль, который вы не забудете, а затем нажмите \"Сохранить\".", + "warning": "Я подтверждаю, что сохранил свой файл Vault", + "password.placeholder": "Пароль", + "password.required": "Требуется пароль", + "password.min": "Пароль должен состоять минимум из 8 символов", + "buttons": { + "savePrivateKey": "Сохранить файл Vault", + "closeWallet": "Закрыть кошелек", + "exportAndCloseWallet": "Export Vault file and Lock Wallet", + "enableExport": "Экспорт", + "cancel": "Отменить" + } + }, + "paymentComponent": { + "title": "Отправить Qubic Units (qus)", + "messages": { + "pleaseUnlock": "Please unlock your Wallet first", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Your transaction could not be sent. Please try again later.", + "failedToDecrypt": "We were not able to decrypt your seed. Did you use the correct private key??", + "failedValidation": "We had validation errors. Please check the form." + }, + "form": { + "sourceSeed": { + "label": "ID с которого будут отправлены qus", + "error": { + "required": "Требуется учетная запись отправителя" + } + }, + "receiver": { + "placeholder": "ID счета получателя", + "hint": "60 заглавных символов", + "chooseOwnSeed": "Выбрать собственный ID", + "error": { + "required": "Требуется ID", + "length": "ID Qubic состоит из 60 заглавных букв" + } + }, + "amount": { + "placeholder": "Сумма в монетах кубика (qus)", + "max.tooltip": "Set to maximum available amount on this Seed", + "error": { + "required": "Сумма обязательна", + "min": "Сумма должна быть минимум 1" + } + }, + "tick": { + "placeholder": "На каком тике выполнить", + "max.tooltip": "Выбрать все доступные средства этого сида", + "customize.tooltip": "Установить тик выполнения вручную", + "error": { + "required": "Обязательно укажите тик", + "min": "Тик должен быть минимум {{currentTick}}" + } + } + }, + "buttons": { + "send": "Выполнить транзакцию", + "reset": "Сбросить", + "loadPrivateKey": "Загрузить файл хранилища" + } + }, + "balanceComponent": { + "title": "Баланс", + "createSeedHint": "Пожалуйста, сначала создайте Seed", + "overview": { + "title": "Обзор", + "totalWalletValue": "Общий баланс кошелька", + "estimatedWalletValue": "Estimated Wallet Value", + "baseDate": "на" + }, + "transactions": { + "title": "Транзакции в текущей эпохе", + "verificationAlert": "Не удалось проверить данные предварительного просмотра", + "noTransactions": "Транзакции не найдены", + "send.tooltip": "Исходящая передача", + "exchange.tooltip": "Internal Transfer", + "explorer.tooltip": "Show Transfer in Explorer", + "receive.tooltip": "Входящая передача", + "status.pending.tooltip": "В ожидании", + "status.executed.tooltip": "В обработке", + "status.dismissed.tooltip": "Отклонено", + "status.unknown.tooltip": "Неизвестно", + "status.confirmed.tooltip": "Непонятно", + "filter.seed.label": "Сортировка по seed" + }, + "repeatTransaction": "Repeat Transaction" + }, + "settings": { + "general": { + "tickAddition.placeholder": "Number of Ticks added to the current tick to send a new transaction", + "webBridge.placeholder": "Enable the Web Bridge (Direct Connection to the QUBIC Network)", + "button.save": "Save Settings", + "beta": { + "placeholder": "Enable Beta Features" + } + }, + "import": { + "title": "Import Settings", + "doneMessage": "Import Successful", + "dropMessage": "Drop your config to import here", + "buttons.import": "Import Config", + "seedsMessage": "You are about to import {{amount}} seeds.", + "goHomeLink": "Show imported Seeds" + }, + "export": { + "title": "Export Settings", + "hint": "Press the below button to download your current config. It contains your encrypted seeds. You also should have saved your private key.", + "buttons.export": "Export/Save Config" + } + }, + "votingComponent": { + "title": "Qubic Computor Voting", + "description": "The Qubic computor voting is used to reach a consensus on topics to be decided regarding the entire network. This can include accepting smart contracts or making other protocol decisions. Only computors are allowed to participate.", + "proposals": { + "editButton": "Edit", + "createButton": "Create Proposal", + "voteButton": "Vote", + "title": "{{amount}} Current Proposals", + "noComputorHint": "You don't have registered any Computor. If you want to propose anything, you need to have at least one Computor Seed.", + "votingResult": "Voting Result", + "noVotes": "no votes", + "from": "From:", + "url": "Propsal URL:" + }, + "participate": { + "title": "Participate", + "cancelButton": "Cancel", + "sendVotesButton": "Send Votes", + "notConfirmedMessage": "This Proposal is not yet confirmed by the Qubic Network. Please wait to vote.", + "noComputorsText": "You do not have Computors or your Computors already have created a proposal.", + "computorsSelected": "Computors selected" + }, + "create": { + "title": "Create Proposal", + "cancelButton": "Cancel", + "sendVotesButton": "Send Proposal", + "alreadyPublished": "This Computor has already a published Proposal. Only one is allowed per Epoch", + "buttons": { + "create": "Create Proposal", + "publish": "Connect and Publish Proposal", + "reset": "Reset Form", + "loadPrivateKey": "Load vault file", + "finish": "Show Proposals" + }, + "form": { + "operatorSeed.label": "Operator Seed", + "operatorSeed.error.required": "Operator is required", + "sourceSeed.label": "Computor to use for proposal", + "sourceSeed.error.required": "Computor is required", + "title.label": "Proposal Title", + "title.placeholder": "Proposal Title", + "title.error.required": "Title is required", + "title.error.min": "Title must have at least 2 characters", + "title.error.max": "Title must have at maximum 100 characters", + "description.label": "Proposal Description", + "description.placeholder": "Proposal Description", + "description.error.min": "Description must have at least 2 characters", + "description.error.max": "Description must have at maximum 1000 characters", + "description.error.required": "Description is required", + "option.label": "Option {{id}}", + "option.placeholder": "Option {{id}}", + "option.error.required": "Option {{id}} is required", + "option.error.min": "Option must have at least 2 characters", + "option.error.max": "Option must have at maximum 50 characters", + "computorIp.label": "Computor IP Address", + "computorIp.placeholder": "Computor IP Address", + "computorIp.error.required": "Computor IP Address required" + }, + "proposalStep.label": "Create Proposal", + "publishStep.label": "Publish Proposal", + "finishStep.label": "Done", + "finishStep.success": "Your Proposal has been sent to your computor." + }, + "status": { + "success": "Accepted by Quorum", + "failed": "Dismissed by Quorum", + "publishing": "Publish in progress", + "pending": "Voting is open", + "draft": "Draft", + "unknown": "Unknown status" + } + }, + "ipoComponent": { + "messages": { + "unlock": "Please unlock your Wallet first", + "storedForPropagation": "Your transaction has been stored for propagation in tick {{tick}}", + "failedToSend": "Your IPO could not be sent. Pleas try again later.", + "failedToDecrypt": "We were not able to decrypt your seed. Did you use the correct private key??", + "failedToValidate": "We had validation errors. Please check the form." + }, + "title": "Qubic IPO", + "description": "The Qubic IPO is an auction for shares of smart contracts.", + "noIpos": "Currently no IPO's active", + "yourBids": "Your Bids", + "yourShares": "Your Shares", + "sharesFor": "Shares for", + "statusValid": "Status valid for tick {{tick}}", + "livPanelHint": "Check out current Results", + "buttons.place-bid": "Place Bid", + "buttons.refresh": "Refresh Status", + "bidStatus.hint": "The status shows only if your bid has been placed. NOT if it was successful.", + "bidStatus.pcs": "pcs", + "place-bid": { + "title": "Place a Bid", + "needBalance": "You need at least one seed with a positive balance.", + "noContract": "Contract not found. Please try again later.", + "noContract.gotoIpoLabel": "Show available Contract IPO's", + "buttons": { + "send": "Send Bid" + }, + "form": { + "quantity": { + "placeholder": "Quantity", + "error.min": "Minimum 1", + "error.required": "Quantity is required" + }, + "price": { + "placeholder": "Price (qus)", + "error.min": "Minimum 1", + "error.required": "Price is required", + "max.tooltip": "Bid all available qus" + } + } + } + }, + "okDialog": { + "title": "Примечание", + "button": "Да, я подтверждаю.", + "messages": { + "tresorText": "Вы скачали свой файл хранилища? Пожалуйста, выберите этот файл хранилища на следующем этапе, чтобы открыть кошелек!" + } + }, + "loadConfigComponent": { + "title": "Импорт счетов", + "buttons": { + "import": "Импортировать", + "cancel": "Отмена" + }, + "messages": { + "import": "Если у вас уже есть файл .config, содержащий ваши открытые ключи, выберите его сейчас и импортируйте.", + "noImport": "Если у вас еще нет файла .config, создайте учетную запись в следующем разделе." + } + }, + "exportConfigComponent": { + "title": "Экспорт счетов", + "buttons": { + "export": "Экспорт", + "cancel": "Отмена" + }, + "messages": { + "export": "Вы изменили свой инвентарь счетов. Обязательно загрузите текущую конфигурацию, чтобы впоследствии импортировать её.", + "info": "Он содержит ваши зашифрованные сиды.", + "unlockInfo": "Please unlock your Vault to be able to export your Vault file with the newest inventory." + } + }, + "welcomeComponent": { + "welcomeMessage": "To use this Wallet you must either create or import your existing Vault. This will contain your public/private key which afterwards is used to encrypt/decrypt your data.", + "button": { + "createVault": "Create Vault", + "importVault": "Import Vault" + }, + "title": "Welcome to the Qubic Wallet" + }, + "importComponent": { + "title": "Import Vault", + "message": "You can import an existing Vault to your Wallet." + }, + "createVaultComponent": { + "createVault": { + "message": "This step will create a private/public key pair for the wallet. Choose a name and select \"Create Vault\" to create your Qubic\r\n Wallet.", + "stepTitle": "Create Vault", + "vaultName": "Name", + "button": "Create Vault" + }, + "createAddress": { + "title": "Add Address", + "message": "In your Qubic Wallet you can have multiple Addresses. Every Address\r\n consists of a Seed (private Key) and a Public Id. The Seed is needed to\r\n send Qubic and the Public Id can be used to receive Qubic. We create now\r\n your first Address.", + "addressNam": "Name", + "seed": "Seed", + "seedPlaceholder": "Choose a random seed...", + "publicId": "Public Id", + "radomizeSeed": "Randomize Seed", + "addressPlaceholder": "Choose an Account Name", + "button": "Create Address" + }, + "downloadVault": { + "stepTitle": "Download initial Vault", + "message": "Your personal Vault has been created. You can now download it. Please\r\n choose a secure Password and select \"Download Vault\".", + "password": "Password", + "passwordHint": "Choose a secure password...", + "button": "Download Vault" + }, + "verifyVault": { + "stpTitle": "Load/Import Vault", + "message": "The Vault file which you have downloaded is the file which contains\r\n all important information. Everytime when you want to unlock your\r\n wallet, you will need this file. Everytime when you change your Wallet\r\n (e.g. add or edit an address) you will be prompted do download the\r\n newest Vault file. To Ensure this works for you. Please select below\r\n the downloaded Vault file and enter your Vault Password again.", + "password": "Password", + "passwordHint": "Your Vault Password", + "button": "Verify Vault File" + }, + "done": { + "stepTitle": "Done", + "message": "Happy Qubic! Your Wallet is ready.", + "button": "Open My Wallet" + }, + "buttons": { + "cancel": "Cancel", + "reset": "Reset" + } + } +} diff --git a/src/assets/icons/icon-128x128.png b/src/assets/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..23587ee9c7b22e4301765d59b585159ceec8bc97 GIT binary patch literal 848 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&v7|ftIx;Y9?C1WI$O_~q1o(uw zGKkAZboQ_N_D9j#n}JufY2OhBQCY9@x}E?3GfF9mncCW>=dvkk#!s5D;pabtusAsr z>m&dFhqd*%7gzD9=$OT&Ms-iJNJvkbHb>nn(7(31`M@!tMh<0dyNrDA%6eV>&)M?>Sepn`%UR$NSp{|j6h>?Mnk+GGDfwqBxm4QJ;>eXHp4Y~O#nQ4`{HE>$w8Ui(>foup$ zELSKf%1_J8NmVGREJ#(zEGS84;PMOzafXR=DS&~I1(&gfiIIt=Ns5695F$XDVX}dd zSt?M#*wo0x%)}hT2TOxUph~U_OB(bT7#Q0;T^vIy=DeNNn|DY-q}BVlRK!fay8-5F z-~XTX`h1C$fT5;1&vTEYOS5mBXSUt$yVCBvW@v4Q(MF(aVPGEXf`@u@SDi~TR(JS( zC~Vq|DBr7xZ{4_hHCn<^;lOIKzVk(28uGVn$a30WEV;;`K|b)dP`t3ibDg~BY!N-L z_WLI@yij-i`0dey$|FoG{vW^D$haUbrayy0{1@{KnGN01>o^$Nig~gRa0-06Y$&^c zK|(g8xRfEgf$6|*HjQNtX%8L3_b{JmTvx$<>(OKZ%Z9iHnGDt{$7Os03<~TQxF;}I zK4++6WMwE~*vnu!p`34lII4t0pyh*_YQO8;TM9BfpC349khbpVnZjS)B9;$sJ3CEc ze%zTSyKn}RzQj~!^QpHOXSu!*T;{N>%;D*421$o@O^rWBM?@Bgd(3kdIC?Mm)#OLg z*JU>^D|V3E*Sj%q=FK&~yWVU3JNK%6Y03pv0saN`lRS6@v|xe95b##`wRk&Mv%mYl QM_WLmp00i_>zopr0GstZ=Kufz literal 0 HcmV?d00001 diff --git a/src/assets/icons/icon-144x144.png b/src/assets/icons/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..675bc182e95346523dd1bb68cbb469a16486caa9 GIT binary patch literal 1302 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=SkfJR9T^xl_H+M9WCij|1AIbU z8N}qGdnV6+{G5SL%sM5TU&mzS`!9WGFS99X?D+qGek#zn&1u5s_-pvI1wcOFc>aw}`W zGN1|bAHQ7q?DeXT-)7vpFQ99he&g)|paaxPg8YKd|3?83F0vqm&9nCP8lV==0*}aI z1_r((Aj~*bn@<`js9NG0QIe8al4_M)lnSI6j0}uSbPWu3jm$%g46KZdtxOEG4GgRd z3@TEu_M&LW%}>cptHiB=(<0Xps38qxLr`M5LP1e}T4qkFLP=#oszPQ#NiqYMXF!NE zOq@#r42&$ej4e!zOe{@O3`~F!0n!YU4UEiEfda;+MkZz^<{&;;8bktBa$Q)`pvS<# zY~bnQ7*a9k?VN{xw;cppoTI$L)?J#{xHLdP!SUXIK~E8xH@CmO-Sz40&P%DGPXiZ75S#w|Q2q!CS)1`m3ZPs*tDQ$$4Yutsey$JDWe$_$*%LQ4b&MT}3ZTmx^|arvmAv9%luX8o5-;UJ8?3ZgixgU1O@^A?qV6c?|C@ z?DHt?_`p}{vdWpKK;zBzB|jHix^T3&{k|YR@sU8X%&YVj{wgv`J2T!x z8g_GnMo~us-&|u8l`d_aGYda!b$6Z$i*O9yb;zr}EA+-?-N`OTwcjk^Q8YWIDan-E z^NwesnOlBa!`H)86;u9xNa2XFKf}}bnmt;Q>3aV{_g1Z(m`}kV_KC$wqGj^-8hxo8 zAs4nJHqTN7n%c%2)m9){w!Syn1xSaNg66&cOn+<;%v)q!nD|zTDe>}vOIe#}8x2%vqezED}G`UZ% zP4?DbRb7|OU&yZV_axgDo0{ue-!ebcdh>8u?d7Yne1DZ1HA`B*GG>ad-Qc{(pgkjz z@8czzL!lAs0vitfYA6uB#tF31Pay%Q=AqUaVUF;`xef=oUNeK0tUF}Y*dTh1y=Bb? zJ%yCkQpT%Xvzc~T)mC$Ty{jOdQC{IO*?soQ->KUUao^wmsN%PycxwY+|D@Y*4}V+# z!{?{yXC~IzrwwTVteZj_bwU-qMNb5wFu(i^XOCBxJzl^1-T#?i89$m{cvSpr?mJ*^ OW$<+Mb6Mw<&;$TEyEyg$ literal 0 HcmV?d00001 diff --git a/src/assets/icons/icon-152x152.png b/src/assets/icons/icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa869b41815e9707218f6269453273b05ce1407 GIT binary patch literal 1313 zcmeAS@N?(olHy`uVBq!ia0vp^GeDSw8A$5OTo49QEa{HEjtmSN`?>!lvI6!q+2Vz|*>ih~+%30tMSp{|j6h>?Mnk+GGDfwqBxm4QJ;>eXHp4Y~O#nQ4`{HE>$w8Ui(>foup$ zELSKf%1_J8NmVGREJ#(zEGS84;PMOzafXR=DS&~I1(&gfiIIt=Ns5695F$XDVX}dd zSt?M#*wo0x%)}hT2TOxUph~U_OB(bT7?`6yT^vIy=Ddx0n|IrQ=gT%DlW!ACBX?bW z`|5lBnWP(UCMZpv;ovLFCCjD4_~miI9%a?5CqE=N99jO5q03JPANua}Cc-)6t&M*^`0SLkPOtLT%o+c; z3rVl`{-#pazv{-`)vZcq4>gWWx{>G-)KjXd-7Qs}^J#j)uB154TIpw6$Cf7LX$5;_ z@-DM6+o&Ir-M@3?lP@80DZxuic&4qs@$~Z6khH0nq?&HpSCd@3~k zX=>!OB(IrSTCKdFMTF&7Z4TPwbk=L%9yQIdWtZnqRk^=JBW=<1Ws{!H);U`8<4>ff zyDH;ZugncHN9X9a8EbD%knF1b%|06_qSJpiD%R{!68L23pe4Jv!ys+x#cqzLF_AA^TZ-0QsoHu!wnLj~skq>=ok1Mi z_|zLhtk{$f?ROldk{kwKdzRamU^{I)w=hAE42|+-e8Y^|aWZnNM9d{?! zbLrJ?1)%dG+`E2DB_=FdBd{{2R`upq|5QbZbdwveny-ZGzxx*c=J#|dxoOKE?d{%u z_qOZb$iH7RYu`W0`(L)Pb=Te<-WlT22EYD4e0uH3nWM2@yKgw<7_or`tE637j(#~B z8@Bs~Lr&4xq$xpsH{O8zF)V?Ksl*P*U))c36dN)c+VoU|Gk&;OXk; Jvd$@?2>?B#IM@IH literal 0 HcmV?d00001 diff --git a/src/assets/icons/icon-192x192.png b/src/assets/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..0eba71c662b5cc8a901c18ee1c394b3b70365166 GIT binary patch literal 1203 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE8Azrw%`pX1Ea{HEjtmSN`?>!lvI6-n0X`wF z4C3-p-4j(k0_NO*%D^k;U)#bcrDUFvw)6l0`dtV4w2jvP_#4sLzv1UUPGv0yA*syy zOFg3!)_waeZ)ziMX4kau2m`-_eP+SI|NrxsuT7mfUpFXH#>Qp&+fQyqmF-7P$~m|f zuimuq+3UCo(_0Q4b;v9LnjcW#R=8q)_QK@~PM!tJ*YdGl3I)1HrzFTPc=vxau=_uT z(0{1V{rtrBKz*DA9+AZi417mGm~pB$pEOWVwZt`|BqgyV)hf9t6-Y4{85o)98W`#t znTHq|SQ!~xnHXpr7+4t?RHR<*MbVI(pOTqYiCY7wMXn)GLmJ42pu}>8f};Gi%$!t( zlFEWqh0KDIWCkwJfDmVxIF|w#7+G)`TbLM`Sem35m;fOHq!}g~7@4I41&mFNOw3Ho zL42?@hy<$Sy0D}{kAZ<{r>Bc!NX4ADa})C~JMgpxpJ>|t`l;K@RfpIXUtqZP@Be>i zpIezut0r3?-FSD8|F5f}?{pM+P%vuEGLdmMx79 zW&#)3m~J`11<%f6{WWp*wlc%UDVOTzpNp?`T-$ZvvhC@^w|7@P$bLUf{KaJfCHB7+ z(~I8z4c}(Auik6x?G;t5mnN3ov1R>rci+8`TLStH&R^A5iT^mv{pQ80vs_>tlluCQPtC#Oit0#`N@)(MQ7jbBq34$s--a3KF#3rmr1o8@DsH0el3 zwwyML>v@J}Zi+duEdjbk?C_jIMyWsbdMQB)*Yh|J&&h18V3gdTIU)Pvi5_kR<{+k> zVv+`W0v~5vDmKP+C;B-(kSLcq_{X5UTA{DvN18SB-S3Z0kH0+ad+)lMbmVlmqVLag zC-<&l0pZz_8VAzYxE$Cdd^lF{6sxXLJhIQYKv4UE^^q1gHEt=%W=_Tw2dR{XgDnhg zmYD`;3}*-&Fi__ONi;Sj`bqqkym90}(!PnYvP!>mIchiDW#2XX_VLS+>-_ueU;k%M zm29lP-!`XqZ_HI46$N%|DF`K5&0dySSGnvb_mQ%Er$#Xo0bsUa@O1TaS?83{1OT9T B@D%_6 literal 0 HcmV?d00001 diff --git a/src/assets/icons/icon-384x384.png b/src/assets/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..a99eb4c91eec50fd97a50e0fc208614381609eb9 GIT binary patch literal 2863 zcmdT`eN>WH9DZLEC7hWZv(hq}t?4n9kdRQqkIZc5%#UT6fm1Z61u3S83N5R(Og*j5 zwo{qev0C#hPojpxvSp^JZE2c9n#a+HN{V5A0K2c@>CCp}pX+jX?|py#?!)tYp5KM{ zn7^O5G1dYLL6EV}=8XXmgaS(xgwX?2UE!)bVA79v-|7xQW!Xkk;b?GQ=IRSHM|OuL*UN)585`xa}8J89&c#*N&2MZ zwHhBBX0gt-bX>F4(K+Va#fw*qJmL}vA@q!2>n|%_C0s50bj!BjsMsGmWM%})@w=@S z6n9#{_Q=zDt6e=z);KL(U<#~gb`jeVhPB*a02`Sot?FBhiR-Xo`hq^v!Y_+m^coX&BVp9 zIS~-n$3Mt(CXU5T4+0tML?#l5>xq$gB6z(WQEMac1QHVjoYoPDB%(8NKm9Rs1)12^ zivkA-!i@WDbPq~CGx(@COB%fBb}yw>df~eE_uwFpgR3te!`K|&Q>nEK+)(v%!-A7e zjf-URXJ}uFd{p>&KLJ|!ycZc{m5^Y^OHHnE&*Zk?Cey{{pJFf zlVR8ee(+6OH!>P?3FQXdq7){O=PfpyXDPOFx%B#^fsmyyiyT<70oLD|DbWC%&MY*_yrS;596{&@4F1u@f3bUmdbIrdW5IQFvPz}OyCtTkDLbjO(Uhq{y{V>L$2?cr zM64`SkTQ&;3$kVW11%;s=lHL2w9$LY8%6ErJ^8hewo+llMv0-M&(s%cp~nsyl#QE` z;Vs!7%D;zwnH8b;ORo{$6RvJF2xQVrH9`pRW(WXj3%aLEG3cl>MZ`uZk&tRdXq|3|N+ae7fiXx&AQvE286rr=rAMt9 zN8V71L#pK(>2yO>>bFM-48b}Ab2Uyw^OlT}B<6420@d~{PSh8b!RZyVZ07-M5Jjbj zmct}T%NNr={}W%~J01=Jo!>7{=sPVl25fz=8=&sl9XdnxKg}O8e@9p9TzZXbG~32L ztGTqc2tB)N_M6P*B*{>-o3zp}q~QJjv*6ihqI*v5_W!c)T-pfuQOjLHLCMN0Ao`T% znP;k5319gemEQ-B&weX$vU;??s3v`Qs+J`Z3cQ-@X{qB4C(_2H_3~PADNo>4{9;PI zL;9dRx@1U;0~*9jA4#+MLlJrzT`q0C>o|v-h`Mc;f+#E;A@%mWpSzEWHv|-h=#xB0bQ9M4d&kmhjKdxyQ6hkFq zb>ogng)c07^}LT&tA1H1a~&TYmbK7fO=DthvZ8&rIz=HbfwX-paZa1~%MbideEJEb d+xnW?D9p*fY)gJr1bFO%e7yWN7JD$h{tFH-i6H<0 literal 0 HcmV?d00001 diff --git a/src/assets/icons/icon-512x512.png b/src/assets/icons/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..a99eb4c91eec50fd97a50e0fc208614381609eb9 GIT binary patch literal 2863 zcmdT`eN>WH9DZLEC7hWZv(hq}t?4n9kdRQqkIZc5%#UT6fm1Z61u3S83N5R(Og*j5 zwo{qev0C#hPojpxvSp^JZE2c9n#a+HN{V5A0K2c@>CCp}pX+jX?|py#?!)tYp5KM{ zn7^O5G1dYLL6EV}=8XXmgaS(xgwX?2UE!)bVA79v-|7xQW!Xkk;b?GQ=IRSHM|OuL*UN)585`xa}8J89&c#*N&2MZ zwHhBBX0gt-bX>F4(K+Va#fw*qJmL}vA@q!2>n|%_C0s50bj!BjsMsGmWM%})@w=@S z6n9#{_Q=zDt6e=z);KL(U<#~gb`jeVhPB*a02`Sot?FBhiR-Xo`hq^v!Y_+m^coX&BVp9 zIS~-n$3Mt(CXU5T4+0tML?#l5>xq$gB6z(WQEMac1QHVjoYoPDB%(8NKm9Rs1)12^ zivkA-!i@WDbPq~CGx(@COB%fBb}yw>df~eE_uwFpgR3te!`K|&Q>nEK+)(v%!-A7e zjf-URXJ}uFd{p>&KLJ|!ycZc{m5^Y^OHHnE&*Zk?Cey{{pJFf zlVR8ee(+6OH!>P?3FQXdq7){O=PfpyXDPOFx%B#^fsmyyiyT<70oLD|DbWC%&MY*_yrS;596{&@4F1u@f3bUmdbIrdW5IQFvPz}OyCtTkDLbjO(Uhq{y{V>L$2?cr zM64`SkTQ&;3$kVW11%;s=lHL2w9$LY8%6ErJ^8hewo+llMv0-M&(s%cp~nsyl#QE` z;Vs!7%D;zwnH8b;ORo{$6RvJF2xQVrH9`pRW(WXj3%aLEG3cl>MZ`uZk&tRdXq|3|N+ae7fiXx&AQvE286rr=rAMt9 zN8V71L#pK(>2yO>>bFM-48b}Ab2Uyw^OlT}B<6420@d~{PSh8b!RZyVZ07-M5Jjbj zmct}T%NNr={}W%~J01=Jo!>7{=sPVl25fz=8=&sl9XdnxKg}O8e@9p9TzZXbG~32L ztGTqc2tB)N_M6P*B*{>-o3zp}q~QJjv*6ihqI*v5_W!c)T-pfuQOjLHLCMN0Ao`T% znP;k5319gemEQ-B&weX$vU;??s3v`Qs+J`Z3cQ-@X{qB4C(_2H_3~PADNo>4{9;PI zL;9dRx@1U;0~*9jA4#+MLlJrzT`q0C>o|v-h`Mc;f+#E;A@%mWpSzEWHv|-h=#xB0bQ9M4d&kmhjKdxyQ6hkFq zb>ogng)c07^}LT&tA1H1a~&TYmbK7fO=DthvZ8&rIz=HbfwX-paZa1~%MbideEJEb d+xnW?D9p*fY)gJr1bFO%e7yWN7JD$h{tFH-i6H<0 literal 0 HcmV?d00001 diff --git a/src/assets/icons/icon-72x72.png b/src/assets/icons/icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..1ceade703f1f15a15416688adf71ee199020ddf7 GIT binary patch literal 830 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAifOS+@4BLl<6e(pbstU!K#fKP}k zqm)ui?-c#en8h#OF>s6Yp1H&zDjQhe#-^yb`~Uy-KmGz06tCGNq;J0Q*S}StzT0OO zgtqp~xOM;V|NpXfZu6hKv`)#MeecP-Z@()y?_BogBZq>9b6#n9N1v#%HHWg+$^ZY| ziYghz6;{0a9MstUy~n!~XtiodkYDi2|2P3c>Rof408j&Gfk$L90|Va?5N4dJ%_j{u z#WkWNC9x#cD!C{XNHG{07@6oA80s3ChZq@H85vud7-$<9SQ!{pq+abs(U6;;l9^VC zTLY&>t|3rES_#mGpu}>8f};Gi%$!t(lFEWqh0KDIWCkwJfDmVxIF|w#7+G)`TbLM` zSem35m;fOHq!}g~7@4I41&mFNOw3HoL42?@hy<$Sy0D}{kAZe{|lllRHE3I7(Z-54U((Nq*9 ze(0R)>7?-a?*vb#IQSoV9aQ46Yof=q^&Q__4lP&`b5(V7@!A)H+0#5WHEAtAAu@}7 z?ab#rizEZtwk;F8#^Et>+qMuF+5AcUTSNOdtT~#HEpvL-p-sm&u2~z@EbzDOiqwro zvCE&W&oDNfu&6YPH!Le-{zSI?wLi6P#bj4!Rc8rg*K2N_bMmH}w!+pIYRlHfJM^Ep z{PXN18BIRF+?}>;+K>MJ+v8sTNal_*^HtfytR`DUnM8drF;#5|Vexs(F1qk5hyKYgp#gZJD>j9tp2oF}cLHui*Zp-_w27S_E^G)PLP~iTJ^mqxZ?} Us{5Rez}RK*boFyt=akR{0DX8|9{>OV literal 0 HcmV?d00001 diff --git a/src/assets/icons/icon-96x96.png b/src/assets/icons/icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..17dd4c9c010d84d52d6f20464ff248d109808024 GIT binary patch literal 1086 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#B(j9#r85lP9bN@+X1@dD9d_r6q zrIeDU%~5vqopSXS1D}|6N;Xhr-M8Pn{{PqZ593nP+wkjO-`UG-ikdF@Weh@6dLhvn za~Jcg>#hIsSIpGr;Q#+Qi145i(;#>+~U}V8%Y++(#Vri0MU;=~)kY<={U}TmG6fib5 zGBGnT2l2tuAQGsO>%x)-Jq8A*3Qrfukcv5PBQNGP8}Qt*@^Ud&%avQa=IQ_X;weWq zPTrbvsC^52-^UFiKMT%%bNs!<&~DzV-i^X!M>J#E?zO*)zHXRuSn1%#V#z-)7sB?Q55JpO%H}@*;LnfS?)+w2 z#` z)q%O|phnKcm9H*0IfqQ_djH(Wm*u6hhkQ!{Z}x)6vyC~9_XK`*?CQUu!1j8U)wGqt z9~q?tuKT=r^5-9;l*fjN(!R&pGZt{FOVx_!|4Fi$+mC@+$ThY8_74EjVMe_tgR2KMjxASSRL6 zzBrqaG;`Muk%$L%4>o^@us>nKairx-bD)lK8pB10pN?mzt;`aC$)4H0?OD_yMJ?B*cg7N z!2ZRi4+ZudQUd-~JLFds?(LQLn7L_n<6i|+siiIx>H=OLFIU@`^5OSsftjv3zuS1u z&7J=(`kz&$e_F5aycqeoqCIujE@h~+Z8mF`Tx-QtRr>kfmy%lfm}QGL>o!}nRQcR6 z*}*R;x#*z&lgGCn8&B{vvyZiJIHP3tcj;Nhycn&v*xXNi8y{@aY*tg+|0EHKqGc)I$ztaD0e0stHX)X@L{ literal 0 HcmV?d00001 diff --git a/src/assets/icons/wallet.svg b/src/assets/icons/wallet.svg new file mode 100644 index 0000000..f919225 --- /dev/null +++ b/src/assets/icons/wallet.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/wallet_whitemode.svg b/src/assets/icons/wallet_whitemode.svg new file mode 100644 index 0000000..153a612 --- /dev/null +++ b/src/assets/icons/wallet_whitemode.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/img/favicon/android-chrome-192x192.png b/src/assets/img/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..1666dd22f8cefb971be36d7ba3bce1b6df692c36 GIT binary patch literal 1032 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE8Azrw%`pX1Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBDDgJHC&X3S(1KA)iCJ3N zJ}8`7Mg_>`RMKRSP+$<3XH(EnarZY2kCS)sV3AW(boMp~ilzY&Oj|M#nD4sY*W`}LP& zc2VAv)ti3*-|+KaKz(au*Mv1+emdorFR*`w&dyaHvRd(?)z`Iq6!8{ zMHM&S+{LSEw(Y6jx~F>Eo`fm0M2xJsRCPI3bk=FEfB&!i@YOOgL(J4B zb=HE0-3RM|XxD-0p2_?=ChSU@?24NI|NmE*F8c@Qah8%Gzu<#FaJiR#Igrno7|}7jv*Dd-rhYKbjU%(?coB21#YefBYFHD ztjUlmI96Hp|N2GI4IdZzPOV>VkzT7^x><+RF zr3_cFF|IQ!%r-u~>)bza1$&z$vs;BZGJP`_KNf!He&$@mp(i05Q$ps<%iMeY&6_!v z(X-+U{;{2FIJ)%HrqGbclUv)u7oV6D8-0G~yN5g+=BrFMXKdbkWtwf&?R$a@W&as& zfRYRKz<=f&@0nJ}{NVMFpY}R*@vn;;?>GE-^5xB+=Tg1hr*C9CsGW2z*lmB|?y&v!?|d8fBiqZ*ZVLST?_lwP$Cp2MUwnPL`i-eVFo*pbyUVQ4 z-M@dX&-la9V8!r?VFmL7J`9H5&xVjgznLr;sx=BH$)RpQpbX^{)EA-pOiq9iD> zT%n*SKP@vSRiUJ^AXOo=pd^`rp<>SCPdprjVHz5z{7;|pd>X{Stjw*K%q^@e>^)h8 zSy;iP!Q^lXv-0K;h0`~#oH%mkh|Cf8(+wUAy!04ei3^r|ax$F?3NcStKbLh*2~7aF C5PCxZ literal 0 HcmV?d00001 diff --git a/src/assets/img/favicon/android-chrome-512x512.png b/src/assets/img/favicon/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..7017aa1e0e4bde649cb3cdf44258700ebd5f20c9 GIT binary patch literal 3038 zcmeHJSx}Q#6ut={fs`UkMHbltVG)uL!C*jHWM4HP0xqB-B9IWouu9GEuAq%|L1hsH ziy#6CSW!>}K@m~GN(5N~s3=urldvQq=|59n`q0chAh3bLQR?8v;C4 zly#H=04m;IZWI8J@DT}6axgTPm^_9-KHA0K1ppogE!m*}$A(ldia!A9SOB2I0El1; z8U-MU0Kmsc0LT{s&`QXw+vo^iq_@E@*gfrNCf3mvWn_-fF$UU3+IUj(p<^$)_#x48 zxZf zoPjs4^u5KS<2IoY))c~5U#$>|N+*Q-Zr#;i=b?(%BSa(xxbtFQhd{(YO(Abzt1oIfU32v zI>A1LS9`YW^@Z1hz1O+qoiQpFHpXtg7nN0Wyto!fg;P>-(7JOp{uE7ey!;96#!7q-fk|zslA_HrPOYvX+Ih+ z?&0Zw0@eugN7Id-=Sos^fd%rwwuB-Zl z?*GytuH7|}pD*s8vn38pNL5pZo*&YeoPOCh(|K&IM9qPd(KTMIB)r(VEN{(*}0 zyP$fl3wWKZurvS+%YTCotH>o&_mr=aeHxuEFX!K4CZ1|Sy%asc5aZ@ZBxvtt;n)YqxwQ6lDSCVAa}j@U#LSxuR`m;itjF(LxKl6d zyHp!V2OsifnP^Or=X|hqgdcHyAm#9 zFh6u8H&xRUXV3Nr(d^M?U8SMkPnCnSN5-S+;DUhrEBIyqyGM42j2WuIpciO$GJ<3; zOOUtUU=jU?fFu^$K=xnai z&}07sb!WTPkgh7j1PWxouR)fUESbF1!5+@iO;tB*m>H?M5%yD~o*A=YIGdW~AmMKb ztki~y+JXJ8-QyAwX<5=}?x1KkB_z&6fzXyVxG2~*7}2%O$v)v(-3L4rmdw6g%N-aH zW+72#P{RMkDY9=~0+sgyz?`y^v~8*&-WUpU(rCQ*K+rKEdH7< zep^IAov4MGo%C*!$xfNO6?hAe=x=7+zdx z3(Q&@fc&Jv^R4+jE`ME0fs#GL1{Q2i z4-REfcBB|4Br-AOahAvKx*FG=^s#gLd?yd1hzl*9-#m^3>rs8YhW~d z&uYqP7`j2W%~5ignqb5Bp039&Ph0d_6x$)MLLVIXsHMi5cC|YXmjK@G0dAG9kq7?* Dar;A8 literal 0 HcmV?d00001 diff --git a/src/assets/img/favicon/apple-touch-icon.png b/src/assets/img/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..96f6f83170a001d67ee785340b7a5a2c491145a6 GIT binary patch literal 989 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 BL2dv5 literal 0 HcmV?d00001 diff --git a/src/assets/img/favicon/mstile-150x150.png b/src/assets/img/favicon/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..48538d6c2b4368ac467646115576d0dfa073d578 GIT binary patch literal 1022 zcmeAS@N?(olHy`uVBq!ia0y~yVB`Z~4rZW;e?I4QAjOjI=!A~^hmOnIxhgt)S8m?fdiX@n zq7{PrW(<;w4C3<6d8HeF{oVZM|Hfbc9CL~o#N^zIt2X}rxB2h?Y zo-U3d6}R5rara|(6mST<)R5?*cH>Dx(K*Y*f8V#HMEEKvD=t_&@B6l`tJc5EEiGjP znga(aOLwc!ySMMgZT3wwekJGMkF?x$?bASsXE!qkVGl<*g~jSJKm-JALNvKKt-ekwtW5?v=}D zH*VV}cbk9K+6Pyoo1xU#eb-1H|+>a-b zwbekh{qgTx{P^yLlRlBfbLP#B7nvI$clGp4<<&9wO}g^(?Dcj`F>s%D-MKRCmdx6^ zNyvsnJS#X?rsz*<-=)~ixpR{GCZ=XVf2oz2)c%VM`xVvgm*IrwAK%+5A+RFE+h#rs(<%|Q$sFt`! zl%yngTe~DWM4fnw^*^ literal 0 HcmV?d00001 diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..478179d --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/logos/LogoFull_dark.svg b/src/assets/logos/LogoFull_dark.svg new file mode 100644 index 0000000..f3dfd2b --- /dev/null +++ b/src/assets/logos/LogoFull_dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/logos/LogoFull_white.svg b/src/assets/logos/LogoFull_white.svg new file mode 100644 index 0000000..acbaabf --- /dev/null +++ b/src/assets/logos/LogoFull_white.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/logos/Logo_dark.webp b/src/assets/logos/Logo_dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..7ec4e2b2236c7946bd620a8f9df73e942784d485 GIT binary patch literal 366 zcmWIYbaP8%WMBw)bqWXzu<(fjvh_b7tP$WpxNV|}>)v~bx7~lTSMnE1TxpsQtgp{Or znK2y)pC^4>dGcZXpZ@JS~5xW$XLiz&PUjX%v$4|)|=N`d7|R#v%(du{~sf}w%#O7ZF+Q! QXxg`Fu8t8>(bL=+0fgYdxc~qF literal 0 HcmV?d00001 diff --git a/src/assets/logos/Logo_light.webp b/src/assets/logos/Logo_light.webp new file mode 100644 index 0000000000000000000000000000000000000000..f49107ce1d69405026524cf741048a6d6a190289 GIT binary patch literal 350 zcmWIYbaM-1WMBw)bqWXzu<-E&vh_b7tPyyhppZM;?|{~WJNwVxbhy1O_l4=L-~X4p zUfI?g#K76Kx6l5#@d>k_^FIRQpYqr>+^+6EnzC^Vi_cyIma0QDBn;H_|MzhwGjZoh zr2S71vnWtL8L0RCOwnfcH~;VNN}7=8A$svYr^lg(N3Z28a>kvx+rC@kkD}OnU%vm3 z>;Lrs|7id3`2QdB|L3pxJz?psFuhwrOHQTrT1S5hd3eV4RZ#2azcG7A|13C}Mt^XHaoP8&;u>Zl^v+XK(dd|u#GBN-F D=QF-Z literal 0 HcmV?d00001 diff --git a/src/assets/logos/qubic_wallet_dark.svg b/src/assets/logos/qubic_wallet_dark.svg new file mode 100644 index 0000000..0c35616 --- /dev/null +++ b/src/assets/logos/qubic_wallet_dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/logos/qubic_wallet_light.svg b/src/assets/logos/qubic_wallet_light.svg new file mode 100644 index 0000000..5041f69 --- /dev/null +++ b/src/assets/logos/qubic_wallet_light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000..9c09d47 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,7 @@ +export const environment = { + version: 3.0, + production: true, + apiUrl: 'https://api.qubic.li', + explorer:'https://app.qubic.li/network/explorer/address/', + assetsFees: 1000000 + }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..27e47ad --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,7 @@ +export const environment = { + version: 3.0, + production: false, + apiUrl: 'http://localhost:7003', + explorer:'https://app.qubic.li/network/explorer/address/', + assetsFees: 1000000 +}; diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..8590fba --- /dev/null +++ b/src/index.html @@ -0,0 +1,29 @@ + + + + + + Qubic - Wallet + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..c58dc05 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,7 @@ +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; + + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/src/manifest.webmanifest b/src/manifest.webmanifest new file mode 100644 index 0000000..d5b4a3e --- /dev/null +++ b/src/manifest.webmanifest @@ -0,0 +1,59 @@ +{ + "name": "qubic-wallet", + "short_name": "qubic-wallet", + "theme_color": "#1976d2", + "background_color": "#fafafa", + "display": "standalone", + "scope": "./", + "start_url": "./", + "icons": [ + { + "src": "assets/icons/icon-72x72.png", + "sizes": "72x72", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "assets/icons/icon-96x96.png", + "sizes": "96x96", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "assets/icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "assets/icons/icon-144x144.png", + "sizes": "144x144", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "assets/icons/icon-152x152.png", + "sizes": "152x152", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "assets/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "assets/icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "assets/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable any" + } + ] +} diff --git a/src/site.webmanifest b/src/site.webmanifest new file mode 100644 index 0000000..39ece81 --- /dev/null +++ b/src/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/assets/img/favicon/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/assets/img/favicon/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..9058b9e --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,1133 @@ +/* THEMING START */ +@use "@angular/material" as mat; + +@import "vars"; + +// Light Theme Text +$dark-text: #000000; +$dark-positiv-color: #079455; +$dark-negativ-color: #d92d20; +$dark-primary-text: rgba($dark-text, 0.87); +$dark-accent-text: rgba($dark-primary-text, 0.54); +$dark-disabled-text: rgba($dark-primary-text, 0.38); +$dark-dividers: rgba($dark-primary-text, 0.12); +$dark-focused: rgba($dark-primary-text, 0.12); +$dark-link: #1b64f5; + +$mat-light-theme-foreground: ( + base: black, + divider: $dark-dividers, + dividers: $dark-dividers, + disabled: $dark-disabled-text, + disabled-button: rgba($dark-text, 0.26), + disabled-text: $dark-disabled-text, + elevation: black, + secondary-text: $dark-accent-text, + hint-text: $dark-disabled-text, + accent-text: $dark-accent-text, + icon: $dark-accent-text, + icons: $dark-accent-text, + text: $dark-primary-text, + slider-min: $dark-primary-text, + slider-off: rgba($dark-text, 0.26), + slider-off-active: $dark-disabled-text, + link-color: $dark-link, +); + +// Background config +// Light bg +$light-background: #ffffff; +$light-bg-darker-2: darken($light-background, 2%); +$light-bg-darker-5: darken($light-background, 5%); +$light-bg-darker-10: darken($light-background, 10%); +$light-bg-darker-20: darken($light-background, 20%); +$light-bg-darker-30: darken($light-background, 30%); +$light-bg-lighter-5: lighten($light-background, 5%); +$dark-bg-tooltip: lighten(#151e27, 20%); +$dark-bg-alpha-4: rgba(#151e27, 0.04); +$dark-bg-alpha-12: rgba(#151e27, 0.12); + +$mat-light-theme-background: ( + background: $light-background, + status-bar: $light-bg-darker-20, + app-bar: $light-bg-darker-5, + hover: $dark-bg-alpha-4, + card: $light-bg-lighter-5, + dialog: $light-bg-lighter-5, + tooltip: $dark-bg-tooltip, + disabled-button: $dark-bg-alpha-12, + raised-button: $light-bg-lighter-5, + focused-button: $dark-focused, + selected-button: $light-bg-darker-20, + selected-disabled-button: $light-bg-darker-30, + disabled-button-toggle: $light-bg-darker-10, + unselected-chip: $light-bg-darker-10, + disabled-list-option: $light-bg-darker-10, +); + +// Dark Theme text +$light-text: #ffffff; +$light-positiv-color: #47cd89; +$light-negativ-color: #f97066; +$light-primary-text: $light-text; +$light-accent-text: rgba($light-primary-text, 0.7); +$light-disabled-text: rgba($light-primary-text, 0.5); +$light-dividers: rgba($light-primary-text, 0.12); +$light-focused: rgba($light-primary-text, 0.12); +$light-link: #1bdef5; + +$mat-dark-theme-foreground: ( + base: $light-text, + divider: $light-dividers, + dividers: $light-dividers, + disabled: $light-disabled-text, + disabled-button: rgba($light-text, 0.3), + disabled-text: $light-disabled-text, + elevation: black, + hint-text: $light-disabled-text, + secondary-text: $light-accent-text, + accent-text: $light-accent-text, + icon: $light-text, + icons: $light-text, + text: $light-text, + slider-min: $light-text, + slider-off: rgba($light-text, 0.3), + slider-off-active: rgba($light-text, 0.3), + link-color: $light-link, +); + +// Dark bg +$dark-background: $darkBackgroundColor; +$dark-bg-lighter-2: #151e27; +$dark-bg-lighter-5: lighten($dark-background, 5%); +$dark-bg-lighter-10: lighten($dark-background, 10%); +$dark-bg-lighter-20: lighten($dark-background, 20%); +$dark-bg-lighter-30: lighten($dark-background, 30%); +$light-bg-alpha-4: rgba(#ffffff, 0.04); +$light-bg-alpha-12: rgba(#ffffff, 0.12); + +// Background palette for dark themes. +$mat-dark-theme-background: ( + background: $dark-background, + status-bar: $dark-bg-lighter-20, + app-bar: $dark-bg-lighter-5, + hover: $light-bg-alpha-4, + card: $dark-bg-lighter-5, + dialog: $dark-bg-lighter-5, + tooltip: $dark-bg-lighter-20, + disabled-button: $light-bg-alpha-12, + raised-button: $dark-bg-lighter-5, + focused-button: $light-focused, + selected-button: $dark-bg-lighter-20, + selected-disabled-button: $dark-bg-lighter-30, + disabled-button-toggle: $dark-bg-lighter-10, + unselected-chip: $dark-bg-lighter-20, + disabled-list-option: $dark-bg-lighter-10, +); + +// Compute font config +@include mat.core(); + +// Theme Config + +body { + --primary-color: #000000; + --primary-lighter-color: #bebecf; + --primary-darker-color: #171744; + --text-primary-color: #{$light-primary-text}; + --text-primary-lighter-color: #{$dark-primary-text}; + --text-primary-darker-color: #{$light-primary-text}; +} +$mat-primary: ( + main: #1bdef5, + lighter: #1b64f5, + darker: #171744, + 200: #272660, + // For slide toggle, + contrast: + ( + main: $light-primary-text, + lighter: $dark-primary-text, + darker: $light-primary-text, + ), +); +$theme-primary: mat.define-palette($mat-primary, main, lighter, darker); + +body { + --accent-color: #1bdef5; + --accent-lighter-color: #1bdef5; + --accent-darker-color: #2472a7; + --text-accent-color: #{$light-primary-text}; + --text-accent-lighter-color: #{$dark-primary-text}; + --text-accent-darker-color: #{$light-primary-text}; +} + +$mat-accent: ( + main: #1bdef5, + lighter: #1bdef5, + darker: #2472a7, + 200: $light-link, + // For slide toggle, + contrast: + ( + main: $light-primary-text, + lighter: $dark-primary-text, + darker: $light-primary-text, + ), +); +$theme-accent: mat.define-palette($mat-accent, main, lighter, darker); + +body { + --warn-color: #ff0000; + --warn-lighter-color: #ffb3b3; + --warn-darker-color: #ff0000; + --text-warn-color: #{$light-primary-text}; + --text-warn-lighter-color: #{$dark-primary-text}; + --text-warn-darker-color: #{$light-primary-text}; +} +$mat-warn: ( + main: #ff0000, + lighter: #ffb3b3, + darker: #ff0000, + 200: #ff0000, + // For slide toggle, + contrast: + ( + main: $light-primary-text, + lighter: $dark-primary-text, + darker: $light-primary-text, + ), +); +$theme-warn: mat.define-palette($mat-warn, main, lighter, darker); + +$theme: ( + primary: $theme-primary, + accent: $theme-accent, + warn: $theme-warn, + is-dark: false, + foreground: $mat-light-theme-foreground, + background: $mat-light-theme-background, +); +$altTheme: ( + primary: $theme-primary, + accent: $theme-accent, + warn: $theme-warn, + is-dark: true, + foreground: $mat-dark-theme-foreground, + background: $mat-dark-theme-background, +); + +// Theme Init +@include mat.all-component-themes($theme); + +.darkTheme { + @include mat.all-component-themes($altTheme); + + .dashboard-wallet-name { + color: $light-text; + } + .dashboard-balance-name { + color: $light-link; + } + .dashboard-amount-name { + color: $light-accent-text; + } + .dashboard-currency-name { + color: $light-accent-text; + } + .isPositiv { + color: $light-positiv-color; + } + .isNegativ { + color: $light-negativ-color; + } + + .icon-color-link { + color: $light-link; + } + + .mat-mdc-card { + --mdc-elevated-card-container-elevation: 1px 1px 1px 0px rgba(63, 62, 62, 1) !important; + } + + background-color: $darkBackgroundColor; + color: #ffffff; + + .mdc-text-field--focused:not(.mdc-text-field--disabled) .mdc-floating-label { + color: map-get($map: $mat-primary, $key: lighter); + } + + .mat-mdc-card { + background-color: $dark-bg-lighter-2 !important; + } + + .mdc-switch.mdc-switch--selected .mdc-switch__track { + background-color: rgb(97, 97, 97); + } +} + +// Specific component overrides, pieces that are not in line with the general theming + +// Handle buttons appropriately, with respect to line-height +.mat-raised-button, +.mat-stroked-button, +.mat-flat-button { + padding: 0 1.15em; + margin: 0 0.65em; + min-width: 3em; + line-height: 36.4px; +} + +.mat-standard-chip { + padding: 0.5em 0.85em; + min-height: 2.5em; +} + +.material-icons { + font-size: 24px; + font-family: "Material Icons", "Material Icons"; +} + +/* THEMING END */ + +html, +body { + height: 100%; + margin: 0; + padding: 0; + font-family: "Space Grotesk"; + font-size: 1em; +} + +body { + margin: 0; + padding: 0; + font-family: "Space Grotesk"; +} +table, +div, +span, +button, +th, +td, +tr { + font-family: "Space Grotesk"; +} + +table { + border-radius: 12px; + background-color: var(--mat-table-background-color) !important; + padding: 2px; +} + +.mat-mdc-row, +.mdc-data-table__content { + font-size: 1em !important; +} + +.mdc-list-item__primary-text { + display: flex; + align-items: center; + column-gap: 10px; +} + +.mat-toolbar { + display: flex; + justify-content: space-between; +} + +mat-dialog-actions.mat-mdc-dialog-actions { + display: flex; + justify-content: center; + align-items: center; +} + +mat-snack-bar-container.error .mdc-snackbar__surface { + background-color: #faa0a0; + + .mdc-button__label, + .mat-mdc-snack-bar-label .mdc-snackbar__label { + color: black; + } +} + +.content_container { + padding: 24px; + display: flex; + flex-direction: column; + row-gap: 10px; + justify-content: flex-start; +} + +div.copy { + cursor: pointer; + color: $dark-text; + font-family: "Space Mono"; + width: 100%; + word-wrap: break-word; +} + +div.copy, +a:link, +a:visited, +a:active { + text-decoration: none; + //color: map-get($map: $mat-accent, $key: darker); + color: $dark-link; +} + +.darkTheme { + div.copy, + a:link, + a:visited, + a:active { + color: $light-link; + } + + .toolbar { + background-color: $dark-background; + } + + .mat-drawer { + background-color: $dark-background !important; + } + + // todo: AndyQus: adopted, the style is to global and overwrites other styles. + // button[color="accent"] { + // background-color: $light-link !important; + // } +} + +.mat-drawer { + width: 250px; +} +.toolbar { + padding: 0 !important; +} + +a:hover { + text-decoration: underline; +} + +.navigation .mat-drawer-inner-container { + display: flex; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +// stuff for mobile devices + +@media screen and (max-width: 1199px) { + app-navigation.isMobile { + margin: 5px; + + .desktopOnly { + display: none; + } + } + + app-navigation.isDesktop { + .desktopOnly { + display: none; + } + } +} + +@media screen and (min-width: 1200px) { + app-navigation.isDesktop { + .mobileOnly { + display: none; + } + } +} + +h1 { + font-size: 1.5em; +} + +h2 { + margin-top: 5px; + font-size: 1.2em; +} + +/* status buttons start*/ + +.status-buttons { + // Config + $circle-size: 40px; + + // Unfortunatly we need a wrapper element containing the fixed width for centering the button within the animtion (you could also apply the width as an inline style). + .loading-btn-wrapper { + display: inline-block; + width: 50px; + height: $circle-size; + + text-align: center; + } + + .loading-btn { + $root: &; + + position: relative; + + display: inline-block; + width: 100%; + height: 100%; + + background: #03a9f4; + + border: 0; + border-radius: 24px; + + cursor: pointer; + + transition: all 0.33s ease-in-out; + + &:hover { + background: #2196f3; + } + + &, + &:focus { + outline: none; + } + + // Styles for all states + &--pending, + &--success, + &--unknown, + &--confirmed, + &--fail { + // Morph button to circle (width equals height) + width: $circle-size; + + // Prevent any further clicks triggering events during animation + pointer-events: none; + cursor: default; + + // Hide text + #{$root}__text { + opacity: 0; + } + } + + // State "pending" + // Show loading indicator + &--pending:before { + content: ""; + + position: absolute; + top: 50%; + left: 50%; + + display: inline-block; + + // Can't use percentage here as we already show this icon during morph animation + height: #{$circle-size * 0.7}; + width: #{$circle-size * 0.7}; + + border: 3px solid rgba(255, 255, 255, 0.33); + border-top-color: #fff; + border-radius: 50%; + + animation: loading-btn--fade-in 0.33s ease, + loading-btn--rotation 0.66s linear 0s infinite; + } + + // Success state - show check icon + &--success { + // Different background color (also on hover) + &, + &:hover { + background: #8bc34a; + } + + // Use "after" pseudo to trigger new fade in animation, as "before" is already used on "--pending" + &:after { + content: ""; + + position: absolute; + top: 50%; + left: 50%; + + // Simulate checkmark icon + display: inline-block; + height: 25%; + width: 50%; + + border: 3px solid #fff; + border-top-width: 0; + border-right-width: 0; + + transform: translate(-50%, -75%) rotate(-45deg); + + animation: loading-btn--fade-in 0.6s ease; + } + } + + // Success state - show check icon + &--confirmed { + // Different background color (also on hover) + &, + &:hover { + background: #c0c0c0; + } + + // Use "after" pseudo to trigger new fade in animation, as "before" is already used on "--pending" + &:after { + content: ""; + + position: absolute; + top: 50%; + left: 50%; + + // Simulate checkmark icon + // display: inline-block; + // height: 25%; + // width: 50%; + + // border: 3px solid #fff; + // border-top-width: 0; + // border-right-width: 0; + + //transform: translate(-50%, -75%) rotate(-45deg); + + animation: loading-btn--fade-in 0.6s ease; + } + } + + &--unknown { + // Different background color (also on hover) + &, + &:hover { + background: gray; + } + + // Use "after" pseudo to trigger new fade in animation, as "before" is already used on "--pending" + &:after { + content: "?"; + + font-weight: bold; + color: white; + + position: absolute; + top: 50%; + left: 50%; + + // Simulate cross icon + display: inline-block; + height: 65%; + width: 65%; + + transform: translate(-50%, -25%) rotate(-0deg); + + animation: loading-btn--fade-in 0.6s ease; + } + } + + // Fail state - show cross icon + &--fail { + // Different background color (also on hover) + &, + &:hover { + background: #ff5722; + } + + // Use "after" pseudo to trigger new fade in animation, as "before" is already used on "--pending" + &:after { + content: ""; + + position: absolute; + top: 50%; + left: 50%; + + // Simulate cross icon + display: inline-block; + height: 65%; + width: 65%; + + // Using background gradient is the only solution creating a cross with a single element + background: linear-gradient( + to bottom, + transparent 44%, + #fff 44%, + #fff 56%, + transparent 56% + ), + linear-gradient( + to right, + transparent 44%, + #fff 44%, + #fff 56%, + transparent 56% + ); + + transform: translate(-50%, -50%) rotate(-45deg); + + animation: loading-btn--fade-in 0.6s ease; + } + } + + // Text has to be positioned absolute in order prevent line-breaks or trimming of text when morphing button to circle. + &__text { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + + font-size: 13px; + color: #fff; + + transition: inherit; + } + } + + /** +* Animations +*/ + + @keyframes loading-btn--fade-in { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + @keyframes loading-btn--rotation { + 0% { + transform: translate(-50%, -50%) rotate(0deg); + } + + 100% { + transform: translate(-50%, -50%) rotate(360deg); + } + } + + /** +* Optical stuff - has nothing todo with button animation. +*/ + + .state-list { + margin-bottom: 12px; + + .loading-btn-wrapper { + background: repeating-linear-gradient( + 45deg, + #fff, + #fff 10px, + #f0f0f0 10px, + #f0f0f0 20px + ); + } + } + + .loading-btn-wrapper { + & + & { + margin-left: 8px; + } + } +} + +/* status buttons end */ + +/* balance page start */ + +.is-mobile .transaction-list { + margin-right: 0px; + margin-left: 0px; + + .copy span { + word-break: break-all; + } + + .trans-amount { + min-width: 150px !important; + } +} + +/* balance page end */ + +.is-mobile { + h1 { + text-align: center; + } + + .content_container { + padding: 16px !important; + } + + // todo: AndyQus: removed this, because it is to "global" and can cause issues at several places joetom + + // button .mdc-button{ + // font-size: 18px; + // margin: 0px 10px 10px 10px; + // min-width: 290px; + // max-width: 290px; + // min-height: 50px; + // hyphens: auto; + // } + + // .mdc-button{ + // font-size: 18px; + // margin: 0px 10px 10px 10px; + // min-width: 290px; + // max-width: 290px; + // min-height: 50px; + // hyphens: auto; + // } +} + +.mdc-button { + margin: 0px 10px 15px 10px; + min-height: 40px; +} + +// todo: AndyQus: remove, to global + +// button{ +// margin: 0px 10px 15px 10px; +// min-height: 40px; +// } + +.target-highlight { + animation: highlight 2s; +} + +@keyframes highlight { + 0% { + color: none; + } + 50% { + font-weight: bold; + } + 100% { + color: none; + } +} + +.alignRight, +.alignRight .mat-sort-header-container, +.alignRight .mat-sort-header-content, +.alignRight .mdc-data-table__cell { + text-align: right !important; + justify-content: right; +} +.flex-center, +.flex-halign-center { + display: flex; + flex-direction: column; + align-items: center; +} +.flex-valign-center { + display: flex; + align-items: center; +} +.flex-halign-right { + justify-content: right; +} +.flex-halign-left { + justify-content: left; +} +.word-break { + word-break: break-all; +} +.toolbar { + background-color: #ffffff; +} +hr { + border: none; + height: 1px; + /* Set the hr color */ + color: gray; /* old IE */ + background-color: gray; +} + +// todo: AndyQus: removed +// .mat-mdc-select-panel{ +// background-color: gray !important; +// } + +.mdc-switch.mdc-switch--selected:enabled .mdc-switch__icon { + fill: black !important; +} + +.mdc-switch.mdc-switch--selected .mdc-switch__track { + background-color: rgb(224, 224, 224); +} + +.window-drag { + -webkit-app-region: drag; +} +.window-no-drag { + -webkit-app-region: no-drag; +} + +.windowBorder .container { + border: 1px solid gray; +} +.flex { + display: flex; +} +.flex-wrap { + flex-wrap: wrap; +} +@keyframes blink { + 0% { + color: red; + } + 50% { + color: inherit; + } + 100% { + color: red; + } +} +.danger { + animation: blink 1s infinite; +} + +// /*New Design*/ + +.blurred { + filter: blur(5px); +} + +.important { + display: flex; + align-items: center; + column-gap: 10px; + font-size: 1.1em; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +.cdk-overlay-pane { + max-width: 750px; +} + +.start_container { + padding: 10px; + display: flex; + flex-direction: column; + row-gap: 10px; + text-align: center; +} + +.logo-title { + border: 1px solid rgba(255, 255, 255, 0.33); + border-top-color: #fff; + border-radius: 5%; + max-width: 40%; + height: auto; + margin: 50px 0px 50px 0px; +} + +@media (max-width: 800px) { + .logo-title { + max-width: 20%; + } +} + +.title { + text-align: center; + .wallet-icon { + height: 100px; + } +} + +.mdc-data-table__table { + border-spacing: revert-layer !important; +} + +.mat-mdc-card-content:last-child { + padding: 24px; +} + +.mat-mdc-text-field-wrapper { + border-radius: 8px !important; +} + +.mat-mdc-card { + background-color: $light-bg-darker-2 !important; + border-color: $light-bg-darker-30 !important; + box-shadow: $light-bg-darker-30 !important; + --mdc-elevated-card-container-elevation: 0px 2px 1px -1px rgba(0, 0, 0, 0.5), + 0px 1px 1px 0px rgba(0, 0, 0, 0.5), 0px 1px 3px 0px rgba(0, 0, 0, 0.5) !important; + border-radius: 12px !important; +} + +.proposal-card { + margin-bottom: 20px; +} + +.dashboard-wallet-name { + font-size: 16px; + // color:$light-text; +} +.dashboard-balance-name { + font-size: 35px; + color: $dark-text; +} +.dashboard-amount-name { + font-size: 16px; + color: $dark-primary-text; +} + +.dashboard-currency-name { + color: $dark-primary-text; +} + +.isPositiv { + color: $dark-positiv-color; +} + +.isNegativ { + color: $dark-negativ-color; +} + +// analog bootstrap + +.row { + display: flex; + flex-wrap: wrap; +} + +// todo: AndyQus: adjusted to not have horizontal scrolling on mobile + +// .col{ +// min-width: 380px; +// margin-right: 20px; +// } + +.col-1 { + flex: 0 0 8.333333%; + max-width: 8.333333%; +} +.col-2 { + flex: 0 0 16.666667%; + max-width: 16.666667%; +} +.col-3 { + flex: 0 0 25%; + max-width: 25%; +} +.col-4 { + flex: 0 0 33.333333%; + max-width: 33.333333%; +} +.col-5 { + flex: 0 0 41.666667%; + max-width: 41.666667%; +} +.col-6 { + flex: 0 0 50%; + max-width: 50%; +} +.col-7 { + flex: 0 0 58.333333%; + max-width: 58.333333%; +} +.col-8 { + flex: 0 0 66.666667%; + max-width: 66.666667%; +} +.col-9 { + flex: 0 0 75%; + max-width: 75%; +} +.col-10 { + flex: 0 0 83.333333%; + max-width: 83.333333%; +} +.col-11 { + flex: 0 0 91.666667%; + max-width: 91.666667%; +} +.col-12 { + flex: 0 0 100%; + max-width: 100%; +} + +/* Mobile Phone */ +@media (max-width: 896px) { + .col-sm-1 { + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; + } +} + +.button-container { + margin-top: 16px; + display: flex; + justify-content: space-around; + gap: 2px; + flex-wrap: wrap; + row-gap: 2px; +} + +.buttons-vertical{ + flex-direction: column; + align-items: center; + button { + padding-left: 48px; + padding-right: 48px; + } +} \ No newline at end of file diff --git a/src/vars.scss b/src/vars.scss new file mode 100644 index 0000000..4ec49d5 --- /dev/null +++ b/src/vars.scss @@ -0,0 +1,6 @@ +$mainColor: #0d6357; +$highlightColor: rgb(251, 255, 0); + + +$darkBackgroundColor: #101820; +$darkLighterBackgroundColor: #192531; \ No newline at end of file diff --git a/transloco.config.js b/transloco.config.js new file mode 100644 index 0000000..bc486db --- /dev/null +++ b/transloco.config.js @@ -0,0 +1,5 @@ +module.exports = { + rootTranslationsPath: 'src/assets/i18n/', + langs: ['en', 'de', 'es', 'ru', 'nl','fr','pt'], + keysManager: {} +}; diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..374cc9d --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..16b050b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, + "lib": [ + "ES2022", + "dom" + ], + "allowJs": true + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..be7e9da --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..b847846 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,9954 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"7zip-bin@~5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" + integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== + +"@ampproject/remapping@2.2.1", "@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@angular-devkit/architect@0.1602.12": + version "0.1602.12" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1602.12.tgz#a430970acd4ad9f7cc23d41facc2c04ea5770f65" + integrity sha512-19Fwwfx+KvJ01SyI6cstRgqT9+cwer8Ro1T27t1JqlGyOX8tY3pV78ulwxy2+wCzPjR18V6W7cb7Cv6fyK4xog== + dependencies: + "@angular-devkit/core" "16.2.12" + rxjs "7.8.1" + +"@angular-devkit/build-angular@^16.2.5": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-16.2.12.tgz#f13031e1a29baa917ce5a01c3b7e50a9be7384d5" + integrity sha512-VVGKZ0N3gyR0DP7VrcZl4io3ruWYT94mrlyJsJMLlrYy/EX8JCvqrJC9c+dscrtKjhZzjwdyhszkJQY4JfwACA== + dependencies: + "@ampproject/remapping" "2.2.1" + "@angular-devkit/architect" "0.1602.12" + "@angular-devkit/build-webpack" "0.1602.12" + "@angular-devkit/core" "16.2.12" + "@babel/core" "7.22.9" + "@babel/generator" "7.22.9" + "@babel/helper-annotate-as-pure" "7.22.5" + "@babel/helper-split-export-declaration" "7.22.6" + "@babel/plugin-proposal-async-generator-functions" "7.20.7" + "@babel/plugin-transform-async-to-generator" "7.22.5" + "@babel/plugin-transform-runtime" "7.22.9" + "@babel/preset-env" "7.22.9" + "@babel/runtime" "7.22.6" + "@babel/template" "7.22.5" + "@discoveryjs/json-ext" "0.5.7" + "@ngtools/webpack" "16.2.12" + "@vitejs/plugin-basic-ssl" "1.0.1" + ansi-colors "4.1.3" + autoprefixer "10.4.14" + babel-loader "9.1.3" + babel-plugin-istanbul "6.1.1" + browserslist "^4.21.5" + chokidar "3.5.3" + copy-webpack-plugin "11.0.0" + critters "0.0.20" + css-loader "6.8.1" + esbuild-wasm "0.18.17" + fast-glob "3.3.1" + guess-parser "0.4.22" + https-proxy-agent "5.0.1" + inquirer "8.2.4" + jsonc-parser "3.2.0" + karma-source-map-support "1.4.0" + less "4.1.3" + less-loader "11.1.0" + license-webpack-plugin "4.0.2" + loader-utils "3.2.1" + magic-string "0.30.1" + mini-css-extract-plugin "2.7.6" + mrmime "1.0.1" + open "8.4.2" + ora "5.4.1" + parse5-html-rewriting-stream "7.0.0" + picomatch "2.3.1" + piscina "4.0.0" + postcss "8.4.31" + postcss-loader "7.3.3" + resolve-url-loader "5.0.0" + rxjs "7.8.1" + sass "1.64.1" + sass-loader "13.3.2" + semver "7.5.4" + source-map-loader "4.0.1" + source-map-support "0.5.21" + terser "5.19.2" + text-table "0.2.0" + tree-kill "1.2.2" + tslib "2.6.1" + vite "4.5.2" + webpack "5.88.2" + webpack-dev-middleware "6.1.1" + webpack-dev-server "4.15.1" + webpack-merge "5.9.0" + webpack-subresource-integrity "5.1.0" + optionalDependencies: + esbuild "0.18.17" + +"@angular-devkit/build-webpack@0.1602.12": + version "0.1602.12" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1602.12.tgz#a1bc95c3476da281addab25d853c55b9a96aefc7" + integrity sha512-1lmR4jCkxPJuAFXReesEY3CB+/5jSebGE5ry6qJJvNm6kuSc9bzfTytrcwosVY+Q7kAA2ij7kAYw0loGbTjLWA== + dependencies: + "@angular-devkit/architect" "0.1602.12" + rxjs "7.8.1" + +"@angular-devkit/core@16.2.12": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-16.2.12.tgz#5d40e8414d5da14a4281af519d32e1241b002c89" + integrity sha512-o6ziQs+EcEonFezrsA46jbZqkQrs4ckS1bAQj93g5ZjGtieUz8l/U3lclvKpL/iEzWkGVViSYuP2KyW2oqTDiQ== + dependencies: + ajv "8.12.0" + ajv-formats "2.1.1" + jsonc-parser "3.2.0" + picomatch "2.3.1" + rxjs "7.8.1" + source-map "0.7.4" + +"@angular-devkit/schematics@16.2.12": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-16.2.12.tgz#9dbf287b2343059792c97bbfc60a3b52253c66f1" + integrity sha512-lf/Nz2o875pllxGNUcI2by4rctfRsOZOxvaLq2UaH6XG6Re9tqeNfn40a8qXrr9/IYntXnlvEid/pd9e8gFBIw== + dependencies: + "@angular-devkit/core" "16.2.12" + jsonc-parser "3.2.0" + magic-string "0.30.1" + ora "5.4.1" + rxjs "7.8.1" + +"@angular/animations@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-16.2.12.tgz#27744d8176e09e70e0f6d837c3abcfcee843a936" + integrity sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w== + dependencies: + tslib "^2.3.0" + +"@angular/cdk@^16.2.7": + version "16.2.14" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-16.2.14.tgz#d26f8f1e7d2466b509e60489b6acf31bfe923acf" + integrity sha512-n6PrGdiVeSTEmM/HEiwIyg6YQUUymZrb5afaNLGFRM5YL0Y8OBqd+XhCjb0OfD/AfgCUtedVEPwNqrfW8KzgGw== + dependencies: + tslib "^2.3.0" + optionalDependencies: + parse5 "^7.1.2" + +"@angular/cli@~16.2.5": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-16.2.12.tgz#f5ce4eea5409f708963a59a4ab787d6c08196fe3" + integrity sha512-Pcbiraoqdw4rR2Ey5Ooy0ESLS1Ffbjkb6sPfinKRkHmAvyqsmlvkfbB/qK8GrzDSFSWvAKMMXRw9l8nbjvQEXg== + dependencies: + "@angular-devkit/architect" "0.1602.12" + "@angular-devkit/core" "16.2.12" + "@angular-devkit/schematics" "16.2.12" + "@schematics/angular" "16.2.12" + "@yarnpkg/lockfile" "1.1.0" + ansi-colors "4.1.3" + ini "4.1.1" + inquirer "8.2.4" + jsonc-parser "3.2.0" + npm-package-arg "10.1.0" + npm-pick-manifest "8.0.1" + open "8.4.2" + ora "5.4.1" + pacote "15.2.0" + resolve "1.22.2" + semver "7.5.4" + symbol-observable "4.0.0" + yargs "17.7.2" + +"@angular/common@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-16.2.12.tgz#aa1d1522701833f1998001caa1ac95c3ac11d077" + integrity sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w== + dependencies: + tslib "^2.3.0" + +"@angular/compiler-cli@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz#e24b4bdaf23047b23d7b39e295b7d25b38c5734c" + integrity sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA== + dependencies: + "@babel/core" "7.23.2" + "@jridgewell/sourcemap-codec" "^1.4.14" + chokidar "^3.0.0" + convert-source-map "^1.5.1" + reflect-metadata "^0.1.2" + semver "^7.0.0" + tslib "^2.3.0" + yargs "^17.2.1" + +"@angular/compiler@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-16.2.12.tgz#d13366f190706c270b925495fbc12c29097e6b6c" + integrity sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ== + dependencies: + tslib "^2.3.0" + +"@angular/core@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-16.2.12.tgz#f664204275ee5f5eb46bddc0867e7a514731605f" + integrity sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA== + dependencies: + tslib "^2.3.0" + +"@angular/forms@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-16.2.12.tgz#a533ad61a65080281e709ca68840a1da9f189afc" + integrity sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw== + dependencies: + tslib "^2.3.0" + +"@angular/material@^16.2.7": + version "16.2.14" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-16.2.14.tgz#4db0c7d14d3d6ac6c8dac83dced0fb8a030b3b49" + integrity sha512-zQIxUb23elPfiIvddqkIDYqQhAHa9ZwMblfbv+ug8bxr4D0Dw360jIarxCgMjAcLj7Ccl3GBqZMUnVeM6cjthw== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/auto-init" "15.0.0-canary.bc9ae6c9c.0" + "@material/banner" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/button" "15.0.0-canary.bc9ae6c9c.0" + "@material/card" "15.0.0-canary.bc9ae6c9c.0" + "@material/checkbox" "15.0.0-canary.bc9ae6c9c.0" + "@material/chips" "15.0.0-canary.bc9ae6c9c.0" + "@material/circular-progress" "15.0.0-canary.bc9ae6c9c.0" + "@material/data-table" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dialog" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/drawer" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/fab" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" + "@material/form-field" "15.0.0-canary.bc9ae6c9c.0" + "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" + "@material/image-list" "15.0.0-canary.bc9ae6c9c.0" + "@material/layout-grid" "15.0.0-canary.bc9ae6c9c.0" + "@material/line-ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/linear-progress" "15.0.0-canary.bc9ae6c9c.0" + "@material/list" "15.0.0-canary.bc9ae6c9c.0" + "@material/menu" "15.0.0-canary.bc9ae6c9c.0" + "@material/menu-surface" "15.0.0-canary.bc9ae6c9c.0" + "@material/notched-outline" "15.0.0-canary.bc9ae6c9c.0" + "@material/radio" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/segmented-button" "15.0.0-canary.bc9ae6c9c.0" + "@material/select" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/slider" "15.0.0-canary.bc9ae6c9c.0" + "@material/snackbar" "15.0.0-canary.bc9ae6c9c.0" + "@material/switch" "15.0.0-canary.bc9ae6c9c.0" + "@material/tab" "15.0.0-canary.bc9ae6c9c.0" + "@material/tab-bar" "15.0.0-canary.bc9ae6c9c.0" + "@material/tab-indicator" "15.0.0-canary.bc9ae6c9c.0" + "@material/tab-scroller" "15.0.0-canary.bc9ae6c9c.0" + "@material/textfield" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tooltip" "15.0.0-canary.bc9ae6c9c.0" + "@material/top-app-bar" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.3.0" + +"@angular/platform-browser-dynamic@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz#14488188c06013eb4153ac6e0603975f8b679f70" + integrity sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw== + dependencies: + tslib "^2.3.0" + +"@angular/platform-browser@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-16.2.12.tgz#66b5611066cb3f8bb55f035658e978b50720f3b0" + integrity sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ== + dependencies: + tslib "^2.3.0" + +"@angular/router@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-16.2.12.tgz#2f4cae64ddb7f998832aa340dd3f843cfb85cbc8" + integrity sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA== + dependencies: + tslib "^2.3.0" + +"@angular/service-worker@^16.2.8": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-16.2.12.tgz#359e72693de7d1e8015d1beb02689753ede96de6" + integrity sha512-o0z0s4c76NmRASa+mUHn/q6vUKQNa06mGmLBDKm84vRQ1sQ2TJv+R1p8K9WkiM5mGy6tjQCDOgaz13TcxMFWOQ== + dependencies: + tslib "^2.3.0" + +"@assemblyscript/loader@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" + integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + +"@babel/core@7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + 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/core@7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" + integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/core@^7.12.3": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/generator@^7.22.9", "@babel/generator@^7.23.0", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@7.22.5", "@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.15": + version "7.23.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz#25d55fafbaea31fd0e723820bb6cc3df72edf7ea" + integrity sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@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@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" + integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== + 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" + +"@babel/helper-define-polyfill-provider@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" + integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q== + 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" + +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.22.9", "@babel/helper-module-transforms@^7.23.0", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@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@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@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@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + 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" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@7.22.6", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.22.5", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.22.6", "@babel/helpers@^7.23.2", "@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== + dependencies: + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.14.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== + 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" + +"@babel/plugin-proposal-async-generator-functions@7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" + integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ== + dependencies: + "@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@7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== + dependencies: + "@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@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" + integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== + dependencies: + "@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@^7.22.6": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" + integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@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@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" + +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" + integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" + integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.22.5": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" + integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== + dependencies: + "@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@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" + integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" + integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be" + integrity sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw== + 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" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" + integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" + integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" + integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== + dependencies: + "@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/plugin-transform-object-super@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" + integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.6", "@babel/plugin-transform-optional-chaining@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" + integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== + dependencies: + "@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/plugin-transform-parameters@^7.22.5", "@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" + integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== + dependencies: + "@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-transform-property-literals@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027" + integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7" + integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@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.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@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.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@^0.1.5": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6.tgz#31bcdd8f19538437339d17af00d177d854d9d458" + integrity sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.8.4": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + +"@babel/traverse@^7.22.8", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@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.9" + "@babel/types" "^7.23.9" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.4.4": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +"@discoveryjs/json-ext@0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@electron-forge/cli@^6.0.4": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/cli/-/cli-6.4.2.tgz#a4d8dc5d3ed6f5ca358f7b92e756e14390d04b0f" + integrity sha512-bM6YVTV0uUEpIL1jkpARlSm4Li26XZn+avC/lyTdpPqnd65T/oXZNkrAD+2Jb0RlgplOaM21qWm7ybtvKDGDyA== + dependencies: + "@electron-forge/core" "6.4.2" + "@electron-forge/shared-types" "6.4.2" + "@electron/get" "^2.0.0" + chalk "^4.0.0" + commander "^4.1.1" + debug "^4.3.1" + fs-extra "^10.0.0" + listr2 "^5.0.3" + semver "^7.2.1" + +"@electron-forge/core-utils@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/core-utils/-/core-utils-6.4.2.tgz#99c2b459e07ec504b3e0ee0af090e180e78aefa1" + integrity sha512-CjB3aakmRsXAMMDYc8PxNTMf4FdI29y4PErfv7eCXlL5oo3JW0VSKZIV7R8/Po0S0got85q2kmhZgCKuxL1BNA== + dependencies: + "@electron-forge/shared-types" "6.4.2" + "@electron/rebuild" "^3.2.10" + "@malept/cross-spawn-promise" "^2.0.0" + chalk "^4.0.0" + debug "^4.3.1" + find-up "^5.0.0" + fs-extra "^10.0.0" + log-symbols "^4.0.0" + semver "^7.2.1" + yarn-or-npm "^3.0.1" + +"@electron-forge/core@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/core/-/core-6.4.2.tgz#0ba39730e7e27cdbc6565a00c58c5a37a2489050" + integrity sha512-VtrFZ1Q7NG1ov0jJO/tUvUiYdWZ0Y31xw762is/jfpRPD6V/soOpwJJAoWoPK9TZVkTm2pkS8S5LikCMbNCLxw== + dependencies: + "@electron-forge/core-utils" "6.4.2" + "@electron-forge/maker-base" "6.4.2" + "@electron-forge/plugin-base" "6.4.2" + "@electron-forge/publisher-base" "6.4.2" + "@electron-forge/shared-types" "6.4.2" + "@electron-forge/template-base" "6.4.2" + "@electron-forge/template-vite" "6.4.2" + "@electron-forge/template-vite-typescript" "6.4.2" + "@electron-forge/template-webpack" "6.4.2" + "@electron-forge/template-webpack-typescript" "6.4.2" + "@electron/get" "^2.0.0" + "@electron/rebuild" "^3.2.10" + "@malept/cross-spawn-promise" "^2.0.0" + chalk "^4.0.0" + debug "^4.3.1" + electron-packager "^17.1.2" + fast-glob "^3.2.7" + filenamify "^4.1.0" + find-up "^5.0.0" + fs-extra "^10.0.0" + got "^11.8.5" + interpret "^3.1.1" + listr2 "^5.0.3" + lodash "^4.17.20" + log-symbols "^4.0.0" + node-fetch "^2.6.7" + progress "^2.0.3" + rechoir "^0.8.0" + resolve-package "^1.0.1" + semver "^7.2.1" + source-map-support "^0.5.13" + sudo-prompt "^9.1.1" + username "^5.1.0" + yarn-or-npm "^3.0.1" + +"@electron-forge/maker-base@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/maker-base/-/maker-base-6.4.2.tgz#0403f12773f816089f37c42792025162e067defe" + integrity sha512-zW3GH+LqDK9nxQmQEFkJPR8RqiX0lVk6a4mXll3ngujN1fPevO4ivUAWmaEVeC1dH/hXbN7s9m0S6a37MigftQ== + dependencies: + "@electron-forge/shared-types" "6.4.2" + fs-extra "^10.0.0" + which "^2.0.2" + +"@electron-forge/maker-deb@^6.0.4": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/maker-deb/-/maker-deb-6.4.2.tgz#8b2c1a85641d8c7f46a22d5c747ed1da393c51b5" + integrity sha512-tlV8ffivgBP94vtYXgAeXgzeKCaRyLuWH9LT8PQW1QrYbAFpCMmuwk/zFaJkyMklImCWmDFTPYMEqdEJGd7Npg== + dependencies: + "@electron-forge/maker-base" "6.4.2" + "@electron-forge/shared-types" "6.4.2" + optionalDependencies: + electron-installer-debian "^3.2.0" + +"@electron-forge/maker-rpm@^6.0.4": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/maker-rpm/-/maker-rpm-6.4.2.tgz#a687b07382a1b4dec76e2f19588bc599648a3d69" + integrity sha512-+hfbY5pYbAer0y07OtOzVgVBHoTRmemqqZ//T0mKJpyK2ThHKGTvyW8FFlr5jlQs5LoDCM2WHKE8oGtRhivsMg== + dependencies: + "@electron-forge/maker-base" "6.4.2" + "@electron-forge/shared-types" "6.4.2" + optionalDependencies: + electron-installer-redhat "^3.2.0" + +"@electron-forge/maker-squirrel@^6.0.4": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/maker-squirrel/-/maker-squirrel-6.4.2.tgz#92d44fc6cadf6ff23c65dc901c8044d7c8b53f95" + integrity sha512-ukK3RcFaBrQXUzR52PsHxfwDq5XKSnj6A1kkXiyHWqgj+HIU97prBScBb5JRtasPvYN+nDdQO2vlInsLaqcx9Q== + dependencies: + "@electron-forge/maker-base" "6.4.2" + "@electron-forge/shared-types" "6.4.2" + fs-extra "^10.0.0" + optionalDependencies: + electron-winstaller "^5.0.0" + +"@electron-forge/maker-zip@^6.0.4": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/maker-zip/-/maker-zip-6.4.2.tgz#f8a064bde04bfc73756716ed4d7d62bdd455de28" + integrity sha512-k2nfhhnxcYbUS7rCKCisuqEalxtH9l73+lrtfL0aQZiE/BLbDXyNckDIDOPvX0tBEg62nVzUdJonZwOhZVvAMw== + dependencies: + "@electron-forge/maker-base" "6.4.2" + "@electron-forge/shared-types" "6.4.2" + cross-zip "^4.0.0" + fs-extra "^10.0.0" + got "^11.8.5" + +"@electron-forge/plugin-base@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/plugin-base/-/plugin-base-6.4.2.tgz#65054f841728688cc31edeb94479e6bd4bc07782" + integrity sha512-g6AAtQ7fZ94djBmwcnWasQ8xgaNVNjgaQ00GLK0NkmQ7n0PNbsnlMDuw9vdfTiL6WaLg5nxNSYc9bFJP/rtyeA== + dependencies: + "@electron-forge/shared-types" "6.4.2" + +"@electron-forge/publisher-base@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/publisher-base/-/publisher-base-6.4.2.tgz#89a5a85a889bfc96ae760b801a91da39f212f6b5" + integrity sha512-Tnf9O8MFzdT1gsb5EDDaQUoslt7gUuUywtsr+lT/fpBlBQbei2fvioTwvZ1Q1cmsKnld7XhRh6unfgdWLTZzgw== + dependencies: + "@electron-forge/shared-types" "6.4.2" + +"@electron-forge/shared-types@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/shared-types/-/shared-types-6.4.2.tgz#ffc25a21d1bc7e6cb8fcf8dc1e1767c6a8c52d02" + integrity sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw== + dependencies: + "@electron/rebuild" "^3.2.10" + electron-packager "^17.1.2" + listr2 "^5.0.3" + +"@electron-forge/template-base@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/template-base/-/template-base-6.4.2.tgz#9351dac21d46a86e3826feaf4d8ea6286d627e42" + integrity sha512-vsQh+64Fr2Vxg6k8DAahWq4MAdB2F2qTig+LgIJENv8ksbzC1YIq05SBAS/g2674cdr7WdwyukMy2rgxe3rhnQ== + dependencies: + "@electron-forge/shared-types" "6.4.2" + "@malept/cross-spawn-promise" "^2.0.0" + debug "^4.3.1" + fs-extra "^10.0.0" + username "^5.1.0" + +"@electron-forge/template-vite-typescript@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/template-vite-typescript/-/template-vite-typescript-6.4.2.tgz#197a321745b946bd1170d67ed70321193f62e1d8" + integrity sha512-h3pn6onvC/nLglmJuelYU82Qzrh0l6MqvbBGoT39bbDoRLIqmlhWTWppHgDJVXAGrSoH+9BEpptipeBQWirFwg== + dependencies: + "@electron-forge/shared-types" "6.4.2" + "@electron-forge/template-base" "6.4.2" + fs-extra "^10.0.0" + +"@electron-forge/template-vite@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/template-vite/-/template-vite-6.4.2.tgz#c8b49e3517ffca32818446916abf6871afc6f3be" + integrity sha512-NX7jHRblBmIqufMbqWgpI/VnpgF/qMSTq9ZPmDSXamBhid336MC6+DoWzDpXceQZEp0m/jpMLR04ynr8O4jGlg== + dependencies: + "@electron-forge/shared-types" "6.4.2" + "@electron-forge/template-base" "6.4.2" + fs-extra "^10.0.0" + +"@electron-forge/template-webpack-typescript@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-6.4.2.tgz#06dbd326878ffd1ec47b5f3cdea0a7260c8e5568" + integrity sha512-MPAZQ4v6piCED7NT1LTVQf61o6Eg/laNoKbhbrFBSH1i20OUwbtV2MLj6Op292ynI9+1qdHKmFgctr6qPTCAQw== + dependencies: + "@electron-forge/shared-types" "6.4.2" + "@electron-forge/template-base" "6.4.2" + fs-extra "^10.0.0" + +"@electron-forge/template-webpack@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@electron-forge/template-webpack/-/template-webpack-6.4.2.tgz#b8b4cd664d9d2593588bcbb6e0ac1e4c27814ffc" + integrity sha512-9QYr/td4cmnGOj8UF25W6An/eI+JXj9T/b+KFybL3cQ87H1yrQOn2T84Bm5/JaB4SPdIu4FdKRjqwR7C7R0g2w== + dependencies: + "@electron-forge/shared-types" "6.4.2" + "@electron-forge/template-base" "6.4.2" + fs-extra "^10.0.0" + +"@electron/asar@^3.2.1": + version "3.2.8" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.8.tgz#2ea722f3452583dbd4ffdcc4b4f5dc903f1d8178" + integrity sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg== + dependencies: + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + +"@electron/get@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" + integrity sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^11.8.5" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + +"@electron/notarize@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.1.0.tgz#76aaec10c8687225e8d0a427cc9df67611c46ff3" + integrity sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + promise-retry "^2.0.1" + +"@electron/notarize@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-1.2.4.tgz#a7d38773f4cad40df111a5edc64037e5d768ea1e" + integrity sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + +"@electron/osx-sign@1.0.5", "@electron/osx-sign@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" + integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== + dependencies: + compare-version "^0.1.2" + debug "^4.3.4" + fs-extra "^10.0.0" + isbinaryfile "^4.0.8" + minimist "^1.2.6" + plist "^3.0.5" + +"@electron/rebuild@^3.2.10", "@electron/rebuild@^3.3.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.6.0.tgz#60211375a5f8541a71eb07dd2f97354ad0b2b96f" + integrity sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw== + dependencies: + "@malept/cross-spawn-promise" "^2.0.0" + chalk "^4.0.0" + debug "^4.1.1" + detect-libc "^2.0.1" + fs-extra "^10.0.0" + got "^11.7.0" + node-abi "^3.45.0" + node-api-version "^0.2.0" + node-gyp "^9.0.0" + ora "^5.1.0" + read-binary-file-arch "^1.0.6" + semver "^7.3.5" + tar "^6.0.5" + yargs "^17.0.1" + +"@electron/universal@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.4.1.tgz#3fbda2a5ed9ff9f3304c8e8316b94c1e3a7b3785" + integrity sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ== + dependencies: + "@electron/asar" "^3.2.1" + "@malept/cross-spawn-promise" "^1.1.0" + debug "^4.3.1" + dir-compare "^3.0.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + +"@electron/universal@^1.3.2": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.5.1.tgz#f338bc5bcefef88573cf0ab1d5920fac10d06ee5" + integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== + dependencies: + "@electron/asar" "^3.2.1" + "@malept/cross-spawn-promise" "^1.1.0" + debug "^4.3.1" + dir-compare "^3.0.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + +"@esbuild/android-arm64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz#9e00eb6865ed5f2dbe71a1e96f2c52254cd92903" + integrity sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg== + +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.17.tgz#1aa013b65524f4e9f794946b415b32ae963a4618" + integrity sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-x64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.17.tgz#c2bd0469b04ded352de011fae34a7a1d4dcecb79" + integrity sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/darwin-arm64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz#0c21a59cb5bd7a2cec66c7a42431dca42aefeddd" + integrity sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-x64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz#92f8763ff6f97dff1c28a584da7b51b585e87a7b" + integrity sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/freebsd-arm64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz#934f74bdf4022e143ba2f21d421b50fd0fead8f8" + integrity sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-x64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz#16b6e90ba26ecc865eab71c56696258ec7f5d8bf" + integrity sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/linux-arm64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz#179a58e8d4c72116eb068563629349f8f4b48072" + integrity sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz#9d78cf87a310ae9ed985c3915d5126578665c7b5" + integrity sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-ia32@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz#6fed202602d37361bca376c9d113266a722a908c" + integrity sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + +"@esbuild/linux-loong64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz#cdc60304830be1e74560c704bfd72cab8a02fa06" + integrity sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg== + +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-mips64el@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz#c367b2855bb0902f5576291a2049812af2088086" + integrity sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-ppc64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz#7fdc0083d42d64a4651711ee0a7964f489242f45" + integrity sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-riscv64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz#5198a417f3f5b86b10c95647b8bc032e5b6b2b1c" + integrity sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-s390x@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz#7459c2fecdee2d582f0697fb76a4041f4ad1dd1e" + integrity sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-x64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz#948cdbf46d81c81ebd7225a7633009bc56a4488c" + integrity sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/netbsd-x64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz#6bb89668c0e093c5a575ded08e1d308bd7fd63e7" + integrity sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/openbsd-x64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz#abac2ae75fef820ef6c2c48da4666d092584c79d" + integrity sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/sunos-x64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz#74a45fe1db8ea96898f1a9bb401dcf1dadfc8371" + integrity sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/win32-arm64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz#fd95ffd217995589058a4ed8ac17ee72a3d7f615" + integrity sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-ia32@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz#9b7ef5d0df97593a80f946b482e34fcba3fa4aaf" + integrity sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-x64@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz#bcb2e042631b3c15792058e189ed879a22b2968b" + integrity sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== + +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + 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" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@malept/cross-spawn-promise@^1.0.0", "@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/cross-spawn-promise@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" + integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + +"@material/animation@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/animation/-/animation-15.0.0-canary.bc9ae6c9c.0.tgz#7c27a42b027fcc2cd9a97c9d3b8f54a16b47333d" + integrity sha512-leRf+BcZTfC/iSigLXnYgcHAGvFVQveoJT5+2PIRdyPI/bIG7hhciRgacHRsCKC0sGya81dDblLgdkjSUemYLw== + dependencies: + tslib "^2.1.0" + +"@material/auto-init@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-15.0.0-canary.bc9ae6c9c.0.tgz#9536732573cbe3db9613683496884592387c1e7b" + integrity sha512-uxzDq7q3c0Bu1pAsMugc1Ik9ftQYQqZY+5e2ybNplT8gTImJhNt4M2mMiMHbMANk2l3UgICmUyRSomgPBWCPIA== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/banner@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/banner/-/banner-15.0.0-canary.bc9ae6c9c.0.tgz#5b1053ebc4a07bfb5f92f6b457e87cd15ed6ebf7" + integrity sha512-SHeVoidCUFVhXANN6MNWxK9SZoTSgpIP8GZB7kAl52BywLxtV+FirTtLXkg/8RUkxZRyRWl7HvQ0ZFZa7QQAyA== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/button" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/base@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/base/-/base-15.0.0-canary.bc9ae6c9c.0.tgz#99f7243759cc6833707f0bb555db723ea78b9eff" + integrity sha512-Fc3vGuOf+duGo22HTRP6dHdc+MUe0VqQfWOuKrn/wXKD62m0QQR2TqJd3rRhCumH557T5QUyheW943M3E+IGfg== + dependencies: + tslib "^2.1.0" + +"@material/button@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/button/-/button-15.0.0-canary.bc9ae6c9c.0.tgz#adb43ffb0bf57cd634a0c31b6a5f26123e78c2c8" + integrity sha512-3AQgwrPZCTWHDJvwgKq7Cj+BurQ4wTjDdGL+FEnIGUAjJDskwi1yzx5tW2Wf/NxIi7IoPFyOY3UB41jwMiOrnw== + dependencies: + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/card@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/card/-/card-15.0.0-canary.bc9ae6c9c.0.tgz#772ba3d7397335740c3c2058f039be82696aa884" + integrity sha512-nPlhiWvbLmooTnBmV5gmzB0eLWSgLKsSRBYAbIBmO76Okgz1y+fQNLag+lpm/TDaHVsn5fmQJH8e0zIg0rYsQA== + dependencies: + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/checkbox@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-15.0.0-canary.bc9ae6c9c.0.tgz#b13784c068b137386c43ae409517176b986c5d49" + integrity sha512-4tpNnO1L0IppoMF3oeQn8F17t2n0WHB0D7mdJK9rhrujen/fLbekkIC82APB3fdGtLGg3qeNqDqPsJm1YnmrwA== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/chips@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/chips/-/chips-15.0.0-canary.bc9ae6c9c.0.tgz#a77ee7bf8ea9146156996c5632496ebca27520e9" + integrity sha512-fqHKvE5bSWK0bXVkf57MWxZtytGqYBZvvHIOs4JI9HPHEhaJy4CpSw562BEtbm3yFxxALoQknvPW2KYzvADnmA== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/checkbox" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + safevalues "^0.3.4" + tslib "^2.1.0" + +"@material/circular-progress@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-15.0.0-canary.bc9ae6c9c.0.tgz#800cb10a3a66f125a5ed8d4ae9fffdf236da5984" + integrity sha512-Lxe8BGAxQwCQqrLhrYrIP0Uok10h7aYS3RBXP41ph+5GmwJd5zdyE2t93qm2dyThvU6qKuXw9726Dtq/N+wvZQ== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/progress-indicator" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/data-table@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-15.0.0-canary.bc9ae6c9c.0.tgz#0b5b51ed771f9bba8a1b4746448dec25000325c1" + integrity sha512-j/7qplT9+sUpfe4pyWhPbl01qJA+OoNAG3VMJruBBR461ZBKyTi7ssKH9yksFGZ8eCEPkOsk/+kDxsiZvRWkeQ== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/checkbox" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" + "@material/linear-progress" "15.0.0-canary.bc9ae6c9c.0" + "@material/list" "15.0.0-canary.bc9ae6c9c.0" + "@material/menu" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/select" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/density@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/density/-/density-15.0.0-canary.bc9ae6c9c.0.tgz#83d7ef248a8d1818cddb01bcbfc947ab0ae6a952" + integrity sha512-Zt3u07fXrBWLW06Tl5fgvjicxNQMkFdawLyNTzZ5TvbXfVkErILLePwwGaw8LNcvzqJP6ABLA8jiR+sKNoJQCg== + dependencies: + tslib "^2.1.0" + +"@material/dialog@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-15.0.0-canary.bc9ae6c9c.0.tgz#a12e676c9d41009a1f4d5617f386d6b00d6ecdf0" + integrity sha512-o+9a/fmwJ9+gY3Z/uhj/PMVJDq7it1NTWKJn2GwAKdB+fDkT4hb9qEdcxMPyvJJ5ups+XiKZo03+tZrD+38c1w== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/button" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/dom@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/dom/-/dom-15.0.0-canary.bc9ae6c9c.0.tgz#960d25fdfed237c542560278465edb9c33ed44ec" + integrity sha512-ly78R7aoCJtundSUu0UROU+5pQD5Piae0Y1MkN6bs0724azeazX1KeXFeaf06JOXnlr5/41ol+fSUPowjoqnOg== + dependencies: + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/drawer@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-15.0.0-canary.bc9ae6c9c.0.tgz#68838f1a12ddd2bb56795bd187d0ce0192689ce5" + integrity sha512-PFL4cEFnt7VTxDsuspFVNhsFDYyumjU0VWfj3PWB7XudsEfQ3lo85D3HCEtTTbRsCainGN8bgYNDNafLBqiigw== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/list" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/elevation@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-15.0.0-canary.bc9ae6c9c.0.tgz#d8ca5f4b1f387c95326a6220a21178d4e965b30c" + integrity sha512-Ro+Pk8jFuap+T0B0shA3xI1hs2b89dNQ2EIPCNjNMp87emHKAzJfhKb7EZGIwv3+gFLlVaLyIVkb94I89KLsyg== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/fab@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/fab/-/fab-15.0.0-canary.bc9ae6c9c.0.tgz#7e75ae184555a6568e882e854657ad1515b34c00" + integrity sha512-dvU0KWMRglwJEQwmQtFAmJcAjzg9VFF6Aqj78bJYu/DAIGFJ1VTTTSgoXM/XCm1YyQEZ7kZRvxBO37CH54rSDg== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/feature-targeting@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-15.0.0-canary.bc9ae6c9c.0.tgz#f5fd69774664f20f176b3825072d7f2e48de7621" + integrity sha512-wkDjVcoVEYYaJvun28IXdln/foLgPD7n9ZC9TY76GErGCwTq+HWpU6wBAAk+ePmpRFDayw4vI4wBlaWGxLtysQ== + dependencies: + tslib "^2.1.0" + +"@material/floating-label@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-15.0.0-canary.bc9ae6c9c.0.tgz#b1245304edd6dbeedeae0499f292e79f8b2c479a" + integrity sha512-bUWPtXzZITOD/2mkvLkEPO1ngDWmb74y0Kgbz6llHLOQBtycyJIpuoQJ1q2Ez0NM/tFLwPphhAgRqmL3YQ/Kzw== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/focus-ring@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/focus-ring/-/focus-ring-15.0.0-canary.bc9ae6c9c.0.tgz#063396eefa5638edbbf99ac713c1087da1f8434c" + integrity sha512-cZHThVose3GvAlJzpJoBI1iqL6d1/Jj9hXrR+r8Mwtb1hBIUEG3hxfsRd4vGREuzROPlf0OgNf/V+YHoSwgR5w== + dependencies: + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + +"@material/form-field@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-15.0.0-canary.bc9ae6c9c.0.tgz#76d23e14f910a28081ccb438e094e04bbffadf19" + integrity sha512-+JFXy5X44Gue1CbZZAQ6YejnI203lebYwL0i6k0ylDpWHEOdD5xkF2PyHR28r9/65Ebcbwbff6q7kI1SGoT7MA== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/icon-button@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-15.0.0-canary.bc9ae6c9c.0.tgz#67246733d5e1aef1953208d3dfac01425d560ede" + integrity sha512-1a0MHgyIwOs4RzxrVljsqSizGYFlM1zY2AZaLDsgT4G3kzsplTx8HZQ022GpUCjAygW+WLvg4z1qAhQHvsbqlw== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/image-list@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-15.0.0-canary.bc9ae6c9c.0.tgz#9a765ec6caa7e4761a19048679912abc759d7988" + integrity sha512-WKWmiYap2iu4QdqmeUSliLlN4O2Ueqa0OuVAYHn/TCzmQ2xmnhZ1pvDLbs6TplpOmlki7vFfe+aSt5SU9gwfOQ== + dependencies: + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/layout-grid@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-15.0.0-canary.bc9ae6c9c.0.tgz#44f972c0975baa36e14c8d82b69957b7e59c25d3" + integrity sha512-5GqmT6oTZhUGWIb+CLD0ZNyDyTiJsr/rm9oRIi3+vCujACwxFkON9tzBlZohdtFS16nuzUusthN6Jt9UrJcN6Q== + dependencies: + tslib "^2.1.0" + +"@material/line-ripple@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-15.0.0-canary.bc9ae6c9c.0.tgz#0de6f3f4bcca06056ab0dec23a84a7a99fb0ecc4" + integrity sha512-8S30WXEuUdgDdBulzUDlPXD6qMzwCX9SxYb5mGDYLwl199cpSGdXHtGgEcCjokvnpLhdZhcT1Dsxeo1g2Evh5Q== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/linear-progress@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-15.0.0-canary.bc9ae6c9c.0.tgz#12650b19c776542b0b084792ca1d6894dbd54cf4" + integrity sha512-6EJpjrz6aoH2/gXLg9iMe0yF2C42hpQyZoHpmcgTLKeci85ktDvJIjwup8tnk8ULQyFiGiIrhXw2v2RSsiFjvQ== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/progress-indicator" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/list@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/list/-/list-15.0.0-canary.bc9ae6c9c.0.tgz#daaf0ca8cb9b68fb2df0877c12571741b8098ddb" + integrity sha512-TQ1ppqiCMQj/P7bGD4edbIIv4goczZUoiUAaPq/feb1dflvrFMzYqJ7tQRRCyBL8nRhJoI2x99tk8Q2RXvlGUQ== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/menu-surface@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-15.0.0-canary.bc9ae6c9c.0.tgz#213cc9b251e626c54e1f799b3b52d74659b3c549" + integrity sha512-dMtSPN+olTWE+08M5qe4ea1IZOhVryYqzK0Gyb2u1G75rSArUxCOB5rr6OC/ST3Mq3RS6zGuYo7srZt4534K9Q== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/menu@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/menu/-/menu-15.0.0-canary.bc9ae6c9c.0.tgz#162fbd5b608fbf6edd4a65b3963db947c0e4c96b" + integrity sha512-IlAh61xzrzxXs38QZlt74UYt8J431zGznSzDtB1Fqs6YFNd11QPKoiRXn1J2Qu/lUxbFV7i8NBKMCKtia0n6/Q== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/list" "15.0.0-canary.bc9ae6c9c.0" + "@material/menu-surface" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/notched-outline@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-15.0.0-canary.bc9ae6c9c.0.tgz#94d4c7646e75fad9ca78ad66487a3f7445030664" + integrity sha512-WuurMg44xexkvLTBTnsO0A+qnzFjpcPdvgWBGstBepYozsvSF9zJGdb1x7Zv1MmqbpYh/Ohnuxtb/Y3jOh6irg== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/progress-indicator@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-15.0.0-canary.bc9ae6c9c.0.tgz#b440bff7e8b351af7eaf8fa7663f451e7ee112f4" + integrity sha512-uOnsvqw5F2fkeTnTl4MrYzjI7KCLmmLyZaM0cgLNuLsWVlddQE+SGMl28tENx7DUK3HebWq0FxCP8f25LuDD+w== + dependencies: + tslib "^2.1.0" + +"@material/radio@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/radio/-/radio-15.0.0-canary.bc9ae6c9c.0.tgz#18a1724eb4d394faf7a485f116c8353d3685c0ee" + integrity sha512-ehzOK+U1IxQN+OQjgD2lsnf1t7t7RAwQzeO6Czkiuid29ookYbQynWuLWk7NW8H8ohl7lnmfqTP1xSNkkL/F0g== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/ripple@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-15.0.0-canary.bc9ae6c9c.0.tgz#1b64bdb47d1e5016bb0663d8b045a7e63048ad86" + integrity sha512-JfLW+g3GMVDv4cruQ19+HUxpKVdWCldFlIPw1UYezz2h3WTNDy05S3uP2zUdXzZ01C3dkBFviv4nqZ0GCT16MA== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/rtl@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-15.0.0-canary.bc9ae6c9c.0.tgz#a9ba66d0cec2d1d38892d3e9cb65157fcf012dfa" + integrity sha512-SkKLNLFp5QtG7/JEFg9R92qq4MzTcZ5As6sWbH7rRg6ahTHoJEuqE+pOb9Vrtbj84k5gtX+vCYPvCILtSlr2uw== + dependencies: + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/segmented-button@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/segmented-button/-/segmented-button-15.0.0-canary.bc9ae6c9c.0.tgz#635e5a7dee12163b08a78872a0cacd4121024abd" + integrity sha512-YDwkCWP9l5mIZJ7pZJZ2hMDxfBlIGVJ+deNzr8O+Z7/xC5LGXbl4R5aPtUVHygvXAXxpf5096ZD+dSXzYzvWlw== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/select@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/select/-/select-15.0.0-canary.bc9ae6c9c.0.tgz#bd5039d0cb123fef358e85fdd4a002556f11598b" + integrity sha512-unfOWVf7T0sixVG+3k3RTuATfzqvCF6QAzA6J9rlCh/Tq4HuIBNDdV4z19IVu4zwmgWYxY0iSvqWUvdJJYwakQ== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" + "@material/line-ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/list" "15.0.0-canary.bc9ae6c9c.0" + "@material/menu" "15.0.0-canary.bc9ae6c9c.0" + "@material/menu-surface" "15.0.0-canary.bc9ae6c9c.0" + "@material/notched-outline" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/shape@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/shape/-/shape-15.0.0-canary.bc9ae6c9c.0.tgz#c597f8e439dc40799d2de3cfa62006faaf334a20" + integrity sha512-Dsvr771ZKC46ODzoixLdGwlLEQLfxfLrtnRojXABoZf5G3o9KtJU+J+5Ld5aa960OAsCzzANuaub4iR88b1guA== + dependencies: + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/slider@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/slider/-/slider-15.0.0-canary.bc9ae6c9c.0.tgz#5f9fa85cb0b95f45042b14a510d20ae894ee027c" + integrity sha512-3AEu+7PwW4DSNLndue47dh2u7ga4hDJRYmuu7wnJCIWJBnLCkp6C92kNc4Rj5iQY2ftJio5aj1gqryluh5tlYg== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/snackbar@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-15.0.0-canary.bc9ae6c9c.0.tgz#9f482fab88c3be85d06b450b67ac0008b6352875" + integrity sha512-TwwQSYxfGK6mc03/rdDamycND6o+1p61WNd7ElZv1F1CLxB4ihRjbCoH7Qo+oVDaP8CTpjeclka+24RLhQq0mA== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/button" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/switch@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/switch/-/switch-15.0.0-canary.bc9ae6c9c.0.tgz#3de9394d2f23dc7bcc57bf633dde68498356f194" + integrity sha512-OjUjtT0kRz1ASAsOS+dNzwMwvsjmqy5edK57692qmrP6bL4GblFfBDoiNJ6t0AN4OaKcmL5Hy/xNrTdOZW7Qqw== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + safevalues "^0.3.4" + tslib "^2.1.0" + +"@material/tab-bar@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-15.0.0-canary.bc9ae6c9c.0.tgz#952ce40f811a8fe1d54c1698454c9baf84a57e9d" + integrity sha512-Xmtq0wJGfu5k+zQeFeNsr4bUKv7L+feCmUp/gsapJ655LQKMXOUQZtSv9ZqWOfrCMy55hoF1CzGFV+oN3tyWWQ== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/tab" "15.0.0-canary.bc9ae6c9c.0" + "@material/tab-indicator" "15.0.0-canary.bc9ae6c9c.0" + "@material/tab-scroller" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/tab-indicator@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-15.0.0-canary.bc9ae6c9c.0.tgz#be37f0cf107c23da64efd4f385130d7d22a55b9c" + integrity sha512-despCJYi1GrDDq7F2hvLQkObHnSLZPPDxnOzU16zJ6FNYvIdszgfzn2HgAZ6pl5hLOexQ8cla6cAqjTDuaJBhQ== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/tab-scroller@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-15.0.0-canary.bc9ae6c9c.0.tgz#fb7f85a6d89cc3ec60c398cf637d201262b9c749" + integrity sha512-QWHG/EWxirj4V9u2IHz+OSY9XCWrnNrPnNgEufxAJVUKV/A8ma1DYeFSQqxhX709R8wKGdycJksg0Flkl7Gq7w== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/tab" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/tab@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/tab/-/tab-15.0.0-canary.bc9ae6c9c.0.tgz#447482c5d13ce95fa502769e1f4bd91aa28b499f" + integrity sha512-s/L9otAwn/pZwVQZBRQJmPqYeNbjoEbzbjMpDQf/VBG/6dJ+aP03ilIBEkqo8NVnCoChqcdtVCoDNRtbU+yp6w== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/tab-indicator" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/textfield@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-15.0.0-canary.bc9ae6c9c.0.tgz#177df6b286da09015153a3eadb9f6e7ddd990676" + integrity sha512-R3qRex9kCaZIAK8DuxPnVC42R0OaW7AB7fsFknDKeTeVQvRcbnV8E+iWSdqTiGdsi6QQHifX8idUrXw+O45zPw== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/density" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" + "@material/line-ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/notched-outline" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/theme@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/theme/-/theme-15.0.0-canary.bc9ae6c9c.0.tgz#32e8571f6b323cafb3f2f6104c06e40f2d7f37e3" + integrity sha512-CpUwXGE0dbhxQ45Hu9r9wbJtO/MAlv5ER4tBHA9tp/K+SU+lDgurBE2touFMg5INmdfVNtdumxb0nPPLaNQcUg== + dependencies: + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/tokens@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/tokens/-/tokens-15.0.0-canary.bc9ae6c9c.0.tgz#b6833e9186d85c0707ebac2992098b345fe86ecd" + integrity sha512-nbEuGj05txWz6ZMUanpM47SaAD7soyjKILR+XwDell9Zg3bGhsnexCNXPEz2fD+YgomS+jM5XmIcaJJHg/H93Q== + dependencies: + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + +"@material/tooltip@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/tooltip/-/tooltip-15.0.0-canary.bc9ae6c9c.0.tgz#e5703754d44d0daf9fccbaa66fc4dd3aa22b2a5b" + integrity sha512-UzuXp0b9NuWuYLYpPguxrjbJnCmT/Cco8CkjI/6JajxaeA3o2XEBbQfRMTq8PTafuBjCHTc0b0mQY7rtxUp1Gg== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/button" "15.0.0-canary.bc9ae6c9c.0" + "@material/dom" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + safevalues "^0.3.4" + tslib "^2.1.0" + +"@material/top-app-bar@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-15.0.0-canary.bc9ae6c9c.0.tgz#e996435725f36991a6ca80604e032d21527e076d" + integrity sha512-vJWjsvqtdSD5+yQ/9vgoBtBSCvPJ5uF/DVssv8Hdhgs1PYaAcODUi77kdi0+sy/TaWyOsTkQixqmwnFS16zesA== + dependencies: + "@material/animation" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" + "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/shape" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/touch-target@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-15.0.0-canary.bc9ae6c9c.0.tgz#3416302f86483510e47a8aef9392b0a77784652d" + integrity sha512-AqYh9fjt+tv4ZE0C6MeYHblS2H+XwLbDl2mtyrK0DOEnCVQk5/l5ImKDfhrUdFWHvS4a5nBM4AA+sa7KaroLoA== + dependencies: + "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@material/typography@15.0.0-canary.bc9ae6c9c.0": + version "15.0.0-canary.bc9ae6c9c.0" + resolved "https://registry.yarnpkg.com/@material/typography/-/typography-15.0.0-canary.bc9ae6c9c.0.tgz#1ca0641ef8a91945ca01a1aa6651db434741b37b" + integrity sha512-CKsG1zyv34AKPNyZC8olER2OdPII64iR2SzQjpqh1UUvmIFiMPk23LvQ1OnC5aCB14pOXzmVgvJt31r9eNdZ6Q== + dependencies: + "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + tslib "^2.1.0" + +"@ngneat/transloco-persist-lang@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@ngneat/transloco-persist-lang/-/transloco-persist-lang-5.0.0.tgz#7d6c63880781db3fba332ba21bc06bbf07fa8e65" + integrity sha512-vBpHQqTeKZT+V+uvIIEv+KyCq+8HFkCa7lnjvWwcgGupSYjTvZp4PxUm+KOLLmaTIzJDL1OQEaszQ84EzX6Mzg== + dependencies: + tslib "^2.2.0" + +"@ngneat/transloco-utils@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@ngneat/transloco-utils/-/transloco-utils-5.0.0.tgz#23f451565bb3b31f0d865075822dd19708132230" + integrity sha512-e0S+GWyBTmLix9KfYWW/rScYdqQz3z3znNSb+foaA5T3jWs4CPLVo+PV0No7kGjqom8Wy8H3lLvztfhHxYSLyA== + dependencies: + cosmiconfig "^8.1.3" + tslib "^2.3.0" + +"@ngneat/transloco@^5.0.0": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ngneat/transloco/-/transloco-5.0.10.tgz#75b020d68bab8482d2d8c31b97c8dd38dc03603b" + integrity sha512-mWg0nTG8cukZ5mnYGkFTROmtKYQgN72bQenuh9Ubhowtz3c2CLDbKnYz9STgwDkq3PEAYkfEYHYgJemOWIlE6A== + dependencies: + "@ngneat/transloco-utils" "^5.0.0" + flat "6.0.0" + fs-extra "^11.0.0" + glob "^10.0.0" + lodash.kebabcase "^4.1.1" + ora "^5.4.1" + replace-in-file "^7.0.1" + tslib "^2.2.0" + +"@ngtools/webpack@16.2.12": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-16.2.12.tgz#478db8cca94a69f1708c38ad80b62d824c73f543" + integrity sha512-f9R9Qsk8v+ffDxryl6PQ7Wnf2JCNd4dDXOH+d/AuF06VFiwcwGDRDZpmqkAXbFxQfcWTbT1FFvfoJ+SFcJgXLA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + +"@npmcli/git@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.1.0.tgz#ab0ad3fd82bc4d8c1351b6c62f0fa56e8fe6afa6" + integrity sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^3.0.0" + +"@npmcli/installed-package-contents@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + +"@npmcli/run-script@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^3.0.0" + which "^3.0.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@schematics/angular@16.2.12": + version "16.2.12" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-16.2.12.tgz#13e00e7390903cfc00eb8d5c2e74986262aff6ec" + integrity sha512-rc6Dxo7yLnNhECxZyvwv3qL40GvMHw/gMeme8DUGN7zgcUdBJ7LOCURp7EZqOBghMVeeJvLrohitEbs9NhRLBA== + dependencies: + "@angular-devkit/core" "16.2.12" + "@angular-devkit/schematics" "16.2.12" + jsonc-parser "3.2.0" + +"@sigstore/bundle@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" + integrity sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + +"@sigstore/protobuf-specs@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== + +"@sigstore/sign@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-1.0.0.tgz#6b08ebc2f6c92aa5acb07a49784cb6738796f7b4" + integrity sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + make-fetch-happen "^11.0.1" + +"@sigstore/tuf@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.3.tgz#2a65986772ede996485728f027b0514c0b70b160" + integrity sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + tuf-js "^1.1.7" + +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + +"@types/debug@^4.1.6": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.56.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.2.tgz#1c72a9b794aa26a8b94ad26d5b9aa51c8a6384bb" + integrity sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.43" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" + integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.1", "@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/http-cache-semantics@*": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/http-proxy@^1.17.8": + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + dependencies: + "@types/node" "*" + +"@types/jasmine@~5.1.0": + version "5.1.4" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-5.1.4.tgz#0de3f6ca753e10d1600ce1864ae42cfd47cf9924" + integrity sha512-px7OMFO/ncXxixDe1zR13V1iycqWae0MxTaw62RpFlksUi5QuNWgQJFkTQjIOvrmutJbI7Fp2Y2N1F6D2R4G6w== + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + +"@types/mime@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "20.11.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.16.tgz#4411f79411514eb8e2926f036c86c9f0e4ec6708" + integrity sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ== + dependencies: + undici-types "~5.26.4" + +"@types/node@^18.11.18": + version "18.19.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.14.tgz#1880ff1b3ac913f3877f711588e5ed227da01886" + integrity sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg== + dependencies: + undici-types "~5.26.4" + +"@types/plist@^3.0.1": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0" + integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + +"@types/qrcode@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.5.0.tgz#6a98fe9a9a7b2a9a3167b6dde17eff999eabe40b" + integrity sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA== + dependencies: + "@types/node" "*" + +"@types/qs@*": + version "6.9.11" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" + integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/verror@^1.10.3": + version "1.10.9" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.9.tgz#420c32adb9a2dd50b3db4c8f96501e05a0e72941" + integrity sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ== + +"@types/ws@^8.5.5": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +"@vitejs/plugin-basic-ssl@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz#48c46eab21e0730921986ce742563ae83fe7fe34" + integrity sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A== + +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@wessberg/ts-evaluator@0.0.27": + version "0.0.27" + resolved "https://registry.yarnpkg.com/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz#06e8b901d5e84f11199b9f84577c6426ae761767" + integrity sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA== + dependencies: + chalk "^4.1.0" + jsdom "^16.4.0" + object-path "^0.11.5" + tslib "^2.0.3" + +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@yarnpkg/lockfile@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@2.1.1, ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@8.12.0, ajv@^8.0.0, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +angularx-qrcode@^16.0.2: + version "16.0.2" + resolved "https://registry.yarnpkg.com/angularx-qrcode/-/angularx-qrcode-16.0.2.tgz#86af924191546394cb93f9fb8d0c42edd0132894" + integrity sha512-FztOM7vjNu88sGxUU5jG2I+A9TxZBXXYBWINjpwIBbTL+COMgrtzXnScG7TyQeNknv5w3WFJWn59PcngRRYVXA== + dependencies: + qrcode "1.5.3" + tslib "^2.3.0" + +ansi-colors@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@24.9.1: + version "24.9.1" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.9.1.tgz#bf3568529298b4de8595ed1acbb351fe27db5ba4" + integrity sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g== + dependencies: + "7zip-bin" "~5.2.0" + "@develar/schema-utils" "~2.6.5" + "@electron/notarize" "2.1.0" + "@electron/osx-sign" "1.0.5" + "@electron/universal" "1.4.1" + "@malept/flatpak-bundler" "^0.4.0" + "@types/fs-extra" "9.0.13" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "24.8.1" + builder-util-runtime "9.2.3" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.8" + electron-publish "24.8.1" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^5.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^5.1.1" + read-config-file "6.3.2" + sanitize-filename "^1.6.3" + semver "^7.3.8" + tar "^6.1.12" + temp-file "^3.4.0" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +asar@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" + integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async@^3.2.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +author-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" + integrity sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g== + +autoprefixer@10.4.14: + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +babel-loader@9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" + integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== + dependencies: + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" + +babel-plugin-istanbul@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" + integrity sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.5.0" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" + integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.4" + core-js-compat "^3.33.1" + +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" + integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.5.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.2.0, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bignumber.js@^9.1.1, bignumber.js@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.1.1, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.19.0: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== + dependencies: + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boolean@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.14.5, browserslist@^4.21.5, browserslist@^4.22.2: + version "4.22.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" + integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== + dependencies: + caniuse-lite "^1.0.30001580" + electron-to-chromium "^1.4.648" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-equal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" + integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.1.0, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builder-util-runtime@9.2.3: + version "9.2.3" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz#0a82c7aca8eadef46d67b353c638f052c206b83c" + integrity sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@24.8.1: + version "24.8.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.8.1.tgz#594d45b0c86d1d17f5c7bebbb77405080b2571c2" + integrity sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw== + dependencies: + "7zip-bin" "~5.2.0" + "@types/debug" "^4.1.6" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.2.3" + chalk "^4.1.2" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + +cacache@^17.0.0: + version "17.1.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" + integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^7.0.3" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001580: + version "1.0.30001583" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz#abb2970cc370801dc7e27bf290509dc132cfa390" + integrity sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colorette@^2.0.10, colorette@^2.0.19: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config-file-ts@^0.2.4: + version "0.2.6" + resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.6.tgz#b424ff74612fb37f626d6528f08f92ddf5d22027" + integrity sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w== + dependencies: + glob "^10.3.10" + typescript "^5.3.3" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== + dependencies: + is-what "^3.14.1" + +copy-webpack-plugin@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.35.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.1.tgz#215247d7edb9e830efa4218ff719beb2803555e2" + integrity sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw== + dependencies: + browserslist "^4.22.2" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^8.1.3, cosmiconfig@^8.2.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +critters@0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.20.tgz#08ddb961550ab7b3a59370537e4f01df208f7646" + integrity sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw== + dependencies: + chalk "^4.1.0" + css-select "^5.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.2" + htmlparser2 "^8.0.2" + postcss "^8.4.23" + pretty-bytes "^5.3.0" + +cross-spawn-windows-exe@^1.1.0, cross-spawn-windows-exe@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz#46253b0f497676e766faf4a7061004618b5ac5ec" + integrity sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + is-wsl "^2.2.0" + which "^2.0.2" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-zip@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cross-zip/-/cross-zip-4.0.0.tgz#c29bfb2c001659a6d480ae9596f3bee83b48a230" + integrity sha512-MEzGfZo0rqE10O/B+AEcCSJLZsrWuRUvmqJTqHNqBtALhaJc3E3ixLGLJNTRzEA2K34wbmOHC4fwYs9sVsdcCA== + +css-loader@6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.21" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.3" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-format@^4.0.14: + version "4.0.14" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" + integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== + +debug@2.6.9, debug@^2.2.0, debug@^2.5.1: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decimal.js@^10.2.1: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== + +dijkstrajs@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" + integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA== + +dir-compare@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416" + integrity sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg== + dependencies: + buffer-equal "^1.0.0" + minimatch "^3.0.4" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dmg-builder@24.9.1: + version "24.9.1" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.9.1.tgz#04bf6c0dcd235f6214511f2358a78ed2b9379421" + integrity sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ== + dependencies: + app-builder-lib "24.9.1" + builder-util "24.8.1" + builder-util-runtime "9.2.3" + fs-extra "^10.1.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.11" + +dmg-license@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-builder@^24.6.4: + version "24.9.1" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.9.1.tgz#4aee03947963b829a7f48a850fe02c219311ef63" + integrity sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg== + dependencies: + app-builder-lib "24.9.1" + builder-util "24.8.1" + builder-util-runtime "9.2.3" + chalk "^4.1.2" + dmg-builder "24.9.1" + fs-extra "^10.1.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.3.2" + simple-update-notifier "2.0.0" + yargs "^17.6.2" + +electron-installer-common@^0.10.2: + version "0.10.3" + resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444" + integrity sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA== + dependencies: + "@malept/cross-spawn-promise" "^1.0.0" + asar "^3.0.0" + debug "^4.1.1" + fs-extra "^9.0.0" + glob "^7.1.4" + lodash "^4.17.15" + parse-author "^2.0.0" + semver "^7.1.1" + tmp-promise "^3.0.2" + optionalDependencies: + "@types/fs-extra" "^9.0.1" + +electron-installer-debian@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz#2a9c8220f50a57807de8f93619a0d61ec41271e0" + integrity sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw== + dependencies: + "@malept/cross-spawn-promise" "^1.0.0" + debug "^4.1.1" + electron-installer-common "^0.10.2" + fs-extra "^9.0.0" + get-folder-size "^2.0.1" + lodash "^4.17.4" + word-wrap "^1.2.3" + yargs "^16.0.2" + +electron-installer-redhat@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz#4a7f8d67b48b7d5b23bd1eb074f4b684ae43b192" + integrity sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw== + dependencies: + "@malept/cross-spawn-promise" "^1.0.0" + debug "^4.1.1" + electron-installer-common "^0.10.2" + fs-extra "^9.0.0" + lodash "^4.17.15" + word-wrap "^1.2.3" + yargs "^16.0.2" + +electron-packager@^17.1.2: + version "17.1.2" + resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-17.1.2.tgz#18030b28024d242b706d0a8a67ed4cd1a57311aa" + integrity sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw== + dependencies: + "@electron/asar" "^3.2.1" + "@electron/get" "^2.0.0" + "@electron/notarize" "^1.2.3" + "@electron/osx-sign" "^1.0.5" + "@electron/universal" "^1.3.2" + cross-spawn-windows-exe "^1.2.0" + debug "^4.0.1" + extract-zip "^2.0.0" + filenamify "^4.1.0" + fs-extra "^11.1.0" + galactus "^1.0.0" + get-package-info "^1.0.0" + junk "^3.1.0" + parse-author "^2.0.0" + plist "^3.0.0" + rcedit "^3.0.1" + resolve "^1.1.6" + semver "^7.1.3" + yargs-parser "^21.1.1" + +electron-publish@24.8.1: + version "24.8.1" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.8.1.tgz#4216740372bf4297a429543402a1a15ce8c3560b" + integrity sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "24.8.1" + builder-util-runtime "9.2.3" + chalk "^4.1.2" + fs-extra "^10.1.0" + lazy-val "^1.0.5" + mime "^2.5.2" + +electron-remote@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/electron-remote/-/electron-remote-1.3.0.tgz#5c4bd278bd86d8aca0a9215c8d31440f1a0f133a" + integrity sha512-i00MD42fzlmyhsYRUDrMM104OQTT/soEmBmZ707CZ3k/nwa0rrB3a3mpxvR0EI2Q+Xw2VBdhWbk2gYmyg0PS0g== + dependencies: + debug "^2.5.1" + hashids "^1.1.1" + lodash.get "^4.4.2" + pify "^2.3.0" + rxjs "^5.0.0-beta.12" + xmlhttprequest "^1.8.0" + +electron-squirrel-startup@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz#19b4e55933fa0ef8f556784b9c660f772546a0b8" + integrity sha512-Oce8mvgGdFmwr+DsAcXBmFK8jFfN6yaFAP9IvyhTfupM3nFkBku/7VS/mdtJteWumImkC6P+BKGsxScoDDkv9Q== + dependencies: + debug "^2.2.0" + +electron-to-chromium@^1.4.648: + version "1.4.656" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz#b374fb7cab9b782a5bc967c0ce0e19826186b9c9" + integrity sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q== + +electron-winstaller@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/electron-winstaller/-/electron-winstaller-5.2.1.tgz#1a22d8125f35745a9fbbe7c0aa1e91d0556d520e" + integrity sha512-2UuvOGMLLGJioIBsqWANF1A19G7uJuIifae8/pR3FClI21aCJc5nutAOGnZI17kkxUc47UqByqKOl0XSVtwAlQ== + dependencies: + "@electron/asar" "^3.2.1" + debug "^4.1.1" + fs-extra "^7.0.1" + lodash.template "^4.2.2" + temp "^0.9.0" + +electron@^26.3.0: + version "26.6.8" + resolved "https://registry.yarnpkg.com/electron/-/electron-26.6.8.tgz#c31a4fbd9101bcead4a2ff778638cc501b0c5ed9" + integrity sha512-nuzJ5nVButL1jErc97IVb+A6jbContMg5Uuz5fhmZ4NLcygLkSW8FZpnOT7A4k8Saa95xDJOvqGZyQdI/OPNFw== + dependencies: + "@electron/get" "^2.0.0" + "@types/node" "^18.11.18" + extract-zip "^2.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encode-utf8@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-parser@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" + integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== + +engine.io@~6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" + integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== + +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +errno@^0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-errors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.0.0.tgz#1936450fb8cff7bffb969335d0e55dfca7279aab" + integrity sha512-yHV74THqMJUyFKkHyN7hyENcEZM3Dj2a2IrdClY+IT4BFQHkIVwlh8s6uZfjsFydMdNHv0F5mWgAA3ajFbsvVQ== + +es-module-lexer@^1.2.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +esbuild-wasm@0.18.17: + version "0.18.17" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz#d3d8827502c7714212a7b2544ee99132f07189cc" + integrity sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ== + +esbuild@0.18.17: + version "0.18.17" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.17.tgz#2aaf6bc6759b0c605777fdc435fea3969e091cad" + integrity sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg== + optionalDependencies: + "@esbuild/android-arm" "0.18.17" + "@esbuild/android-arm64" "0.18.17" + "@esbuild/android-x64" "0.18.17" + "@esbuild/darwin-arm64" "0.18.17" + "@esbuild/darwin-x64" "0.18.17" + "@esbuild/freebsd-arm64" "0.18.17" + "@esbuild/freebsd-x64" "0.18.17" + "@esbuild/linux-arm" "0.18.17" + "@esbuild/linux-arm64" "0.18.17" + "@esbuild/linux-ia32" "0.18.17" + "@esbuild/linux-loong64" "0.18.17" + "@esbuild/linux-mips64el" "0.18.17" + "@esbuild/linux-ppc64" "0.18.17" + "@esbuild/linux-riscv64" "0.18.17" + "@esbuild/linux-s390x" "0.18.17" + "@esbuild/linux-x64" "0.18.17" + "@esbuild/netbsd-x64" "0.18.17" + "@esbuild/openbsd-x64" "0.18.17" + "@esbuild/sunos-x64" "0.18.17" + "@esbuild/win32-arm64" "0.18.17" + "@esbuild/win32-ia32" "0.18.17" + "@esbuild/win32-x64" "0.18.17" + +esbuild@^0.18.10: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter-asyncresource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz#734ff2e44bf448e627f7748f905d6bdd57bdb65b" + integrity sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + +express@^4.17.3, express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extract-zip@^2.0.0, extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastq@^1.6.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.0.tgz#ca5e1a90b5e68f97fc8b61330d5819b82f5fab03" + integrity sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== + +filenamify@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" + integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.1" + trim-repeated "^1.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-6.0.0.tgz#91dc171d2a361cf353e40afdaa3c40655cd10bb3" + integrity sha512-/aYW7n5yD9HyW9ZHCzW2LGSpyTmbXEdRWdH5ded6K/a2ETgowOripjBqJorQ4/PBa3VPFub28fNruWp+onmIUg== + +flatted@^3.2.7: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +flora-colossus@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flora-colossus/-/flora-colossus-2.0.0.tgz#af1e85db0a8256ef05f3fb531c1235236c97220a" + integrity sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA== + dependencies: + debug "^4.3.4" + fs-extra "^10.1.0" + +follow-redirects@^1.0.0: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^11.0.0, fs-extra@^11.1.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + +fs-monkey@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +galactus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/galactus/-/galactus-1.0.0.tgz#c2615182afa0c6d0859b92e56ae36d052827db7e" + integrity sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ== + dependencies: + debug "^4.3.4" + flora-colossus "^2.0.0" + fs-extra "^10.1.0" + +gar@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" + integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w== + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-folder-size@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-folder-size/-/get-folder-size-2.0.1.tgz#3fe0524dd3bad05257ef1311331417bcd020a497" + integrity sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA== + dependencies: + gar "^1.0.4" + tiny-each-async "2.0.3" + +get-installed-path@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/get-installed-path/-/get-installed-path-2.1.1.tgz#a1f33dc6b8af542c9331084e8edbe37fe2634152" + integrity sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA== + dependencies: + global-modules "1.0.0" + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.3.tgz#9d2d284a238e62672f556361e7d4e1a4686ae50e" + integrity sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ== + dependencies: + es-errors "^1.0.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-package-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-package-info/-/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c" + integrity sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw== + dependencies: + bluebird "^3.1.1" + debug "^2.2.0" + lodash.get "^4.0.0" + read-pkg-up "^2.0.0" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^10.0.0, glob@^10.2.2, glob@^10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.1, glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-modules@1.0.0, global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globalthis@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^13.1.1: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^11.7.0, got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +guess-parser@0.4.22: + version "0.4.22" + resolved "https://registry.yarnpkg.com/guess-parser/-/guess-parser-0.4.22.tgz#c26ab9e21b69bbc761960c5a1511476ae85428eb" + integrity sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg== + dependencies: + "@wessberg/ts-evaluator" "0.0.27" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +hashids@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/hashids/-/hashids-1.2.2.tgz#28635c7f2f7360ba463686078eee837479e8eafb" + integrity sha512-dEHCG2LraR6PNvSGxosZHIRgxF5sNLOIBFEHbj8lfP9WWmu/PWPMzsip1drdVSOFi51N2pU7gZavrgn7sbGFuw== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +hdr-histogram-js@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz#0b860534655722b6e3f3e7dca7b78867cf43dcb5" + integrity sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g== + dependencies: + "@assemblyscript/loader" "^0.10.1" + base64-js "^1.2.0" + pako "^1.0.3" + +hdr-histogram-percentiles-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c" + integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" + integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== + dependencies: + minimatch "^9.0.0" + +ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + +immutable@^4.0.0: + version "4.3.5" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + +import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.8.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isbinaryfile@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.0.tgz#034b7e54989dab8986598cbcea41f66663c65234" + integrity sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.5: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jasmine-core@^4.1.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.6.0.tgz#6884fc3d5b66bf293e422751eed6d6da217c38f5" + integrity sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ== + +jasmine-core@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.1.1.tgz#38b6ccfbe60aa2a863cf441751d9639b5a571edc" + integrity sha512-UrzO3fL7nnxlQXlvTynNAenL+21oUQRlzqQFsA2U11ryb4+NLOCOePZ70PTojEaUKhiFugh7dG0Q+I58xlPdWg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.18.2: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsdom@^16.4.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-parse-even-better-errors@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" + integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +junk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" + integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + +karma-chrome-launcher@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz#eb9c95024f2d6dfbb3748d3415ac9b381906b9a9" + integrity sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q== + dependencies: + which "^1.2.1" + +karma-coverage@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-2.2.1.tgz#e1cc074f93ace9dc4fb7e7aeca7135879c2e358c" + integrity sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A== + dependencies: + istanbul-lib-coverage "^3.2.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.1" + istanbul-reports "^3.0.5" + minimatch "^3.0.4" + +karma-jasmine-html-reporter@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz#f951ad00b08d61d03595402c914d1a589c4930e3" + integrity sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ== + +karma-jasmine@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-5.1.0.tgz#3af4558a6502fa16856a0f346ec2193d4b884b2f" + integrity sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ== + dependencies: + jasmine-core "^4.1.0" + +karma-source-map-support@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" + integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== + dependencies: + source-map-support "^0.5.5" + +karma@~6.4.0: + version "6.4.2" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.2.tgz#a983f874cee6f35990c4b2dcc3d274653714de8e" + integrity sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ== + dependencies: + "@colors/colors" "1.5.0" + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.4.1" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" + +keyv@^4.0.0: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +launch-editor@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + +less-loader@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-11.1.0.tgz#a452384259bdf8e4f6d5fdcc39543609e6313f82" + integrity sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug== + dependencies: + klona "^2.0.4" + +less@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" + integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + +license-webpack-plugin@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz#1e18442ed20b754b82f1adeff42249b81d11aec6" + integrity sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw== + dependencies: + webpack-sources "^3.0.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +listr2@^5.0.3: + version "5.0.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" + integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.19" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.8.0" + through "^2.3.8" + wrap-ansi "^7.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.get@^4.0.0, lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + +lodash.template@^4.2.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +log4js@^6.4.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" + integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + flatted "^3.2.7" + rfdc "^1.3.0" + streamroller "^3.1.5" + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + +magic-string@0.30.1: + version "0.30.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.1.tgz#ce5cd4b0a81a5d032bd69aab4522299b2166284d" + integrity sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +mem@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memfs@^3.4.12, memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mini-css-extract-plugin@2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@^5.1.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-fetch@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" + integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== + dependencies: + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^0.5.1, mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mrmime@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +needle@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049" + integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== + dependencies: + iconv-lite "^0.6.3" + sax "^1.2.4" + +negotiator@0.6.3, negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +net@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/net/-/net-1.0.2.tgz#d1757ec9a7fb2371d83cf4755ce3e27e10829388" + integrity sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ== + +ngx-device-detector@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ngx-device-detector/-/ngx-device-detector-6.0.2.tgz#1aa657a794e42a17120ce76270267d38e01b9d25" + integrity sha512-+zaYUYGepNE4vMBA/6kyc1rhuUm5uU4cwbvFEEy0gAY4OarId15zwcb1iyvQbyrLCXhZW0DrPZTBoQxzp7dyVw== + dependencies: + tslib "^2.0.0" + +ngx-file-drop@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/ngx-file-drop/-/ngx-file-drop-16.0.0.tgz#3f6cb74b5bfee0d7bcd76635c7120d36fa64ff62" + integrity sha512-33RPoZBAiMkV110Rzu3iOrzGcG5M20S4sAiwLzNylfJobu9qVw5XR83FhUelSeqJRoaDxXBRKAozYCSnUf2CNw== + dependencies: + tslib "^2.3.0" + +nice-napi@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nice-napi/-/nice-napi-1.0.2.tgz#dc0ab5a1eac20ce548802fc5686eaa6bc654927b" + integrity sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA== + dependencies: + node-addon-api "^3.0.0" + node-gyp-build "^4.2.2" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-abi@^3.45.0: + version "3.54.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.54.0.tgz#f6386f7548817acac6434c6cba02999c9aebcc69" + integrity sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA== + dependencies: + semver "^7.3.5" + +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-addon-api@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-api-version@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.2.0.tgz#5177441da2b1046a4d4547ab9e0972eed7b1ac1d" + integrity sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg== + dependencies: + semver "^7.3.5" + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-gyp-build@^4.2.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== + +node-gyp@^9.0.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + +npm-install-checks@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@10.1.0, npm-package-arg@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== + dependencies: + ignore-walk "^6.0.0" + +npm-pick-manifest@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" + integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + +npm-pick-manifest@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz#2159778d9c7360420c925c1a2287b5a884c713aa" + integrity sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + +npm-registry-fetch@^14.0.0: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== + dependencies: + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nwsapi@^2.2.0: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@^0.11.5: + version "0.11.8" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" + integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@8.4.2, open@^8.0.9: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +ora@5.4.1, ora@^5.1.0, ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pacote@15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" + integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^5.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + promise-retry "^2.0.1" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" + tar "^6.1.11" + +pako@^1.0.3: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-author@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f" + integrity sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw== + dependencies: + author-regex "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + dependencies: + error-ex "^1.2.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +parse5-html-rewriting-stream@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz#e376d3e762d2950ccbb6bb59823fc1d7e9fdac36" + integrity sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg== + dependencies: + entities "^4.3.0" + parse5 "^7.0.0" + parse5-sax-parser "^7.0.0" + +parse5-sax-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz#4c05064254f0488676aca75fb39ca069ec96dee5" + integrity sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg== + dependencies: + parse5 "^7.0.0" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0, parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== + dependencies: + pify "^2.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@2.3.1, picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +piscina@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.0.0.tgz#f8913d52b2000606d51aaa242f0813a0c77ca3b1" + integrity sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg== + dependencies: + eventemitter-asyncresource "^1.0.0" + hdr-histogram-js "^2.0.1" + hdr-histogram-percentiles-obj "^3.0.0" + optionalDependencies: + nice-napi "^1.0.2" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +plist@^3.0.0, plist@^3.0.4, plist@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + +postcss-loader@7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" + integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== + dependencies: + cosmiconfig "^8.2.0" + jiti "^1.18.2" + semver "^7.3.8" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" + integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" + integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27: + version "8.4.33" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +psl@^1.1.28, psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qrcode@1.5.3, qrcode@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170" + integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg== + dependencies: + dijkstrajs "^1.0.1" + encode-utf8 "^1.0.3" + pngjs "^5.0.0" + yargs "^15.3.1" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +qubic-ts-library@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/qubic-ts-library/-/qubic-ts-library-0.0.6.tgz#18f206820a5b11f12b84d7f96b1f708b47f91123" + integrity sha512-VIDUWK4b35We8K8pCHvC0iT1FM6dj8H0qFDYXVpUEUkBNDUEcD9pHWqjLE9TJP0gg3l5AdPteLuQqJy2ZZzH8g== + dependencies: + bignumber.js "^9.1.2" + net "^1.0.2" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rcedit@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-3.1.0.tgz#1563ec7a5663de639f94c5dc85429db1da364b3e" + integrity sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA== + dependencies: + cross-spawn-windows-exe "^1.1.0" + +read-binary-file-arch@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz#959c4637daa932280a9b911b1a6766a7e44288fc" + integrity sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg== + dependencies: + debug "^4.3.4" + +read-config-file@6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" + integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== + dependencies: + config-file-ts "^0.2.4" + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + +read-package-json-fast@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +read-package-json@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.4.tgz#90318824ec456c287437ea79595f4c2854708836" + integrity sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw== + dependencies: + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +reflect-metadata@^0.1.2: + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-parser@^2.2.11: + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" + integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + 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" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +replace-in-file@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-7.1.0.tgz#ec5d50283a3ce835d62c99d90700aacbada1d2f8" + integrity sha512-1uZmJ78WtqNYCSuPC9IWbweXkGxPOtk2rKuar8diTw7naVIQZiE3Tm8ACx2PCMXDtVH6N+XxwaRY2qZ2xHPqXw== + dependencies: + chalk "^4.1.2" + glob "^8.1.0" + yargs "^17.7.2" + +request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-dir@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-package@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-package/-/resolve-package-1.0.1.tgz#686f70b188bd7d675f5bbc4282ccda060abb9d27" + integrity sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g== + dependencies: + get-installed-path "^2.0.3" + +resolve-url-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" + integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^8.2.14" + source-map "0.6.1" + +resolve@1.22.2: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +rollup@^3.27.1: + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== + optionalDependencies: + fsevents "~2.3.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@7.8.1, rxjs@^7.5.5, rxjs@^7.8.0: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +rxjs@^5.0.0-beta.12: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +rxjs@~7.5.0: + version "7.5.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" + integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +safevalues@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.3.4.tgz#82e846a02b6956d7d40bf9f41e92e13fce0186db" + integrity sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw== + +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sass-loader@13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6" + integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg== + dependencies: + neo-async "^2.6.2" + +sass@1.64.1: + version "1.64.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.1.tgz#6a46f6d68e0fa5ad90aa59ce025673ddaa8441cf" + integrity sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@7.5.4, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== + dependencies: + define-data-property "^1.1.1" + function-bind "^1.1.2" + get-intrinsic "^1.2.2" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^1.3.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.9.0.tgz#1e7ad8933aa99b75c6898ddd0eeebc3eb0d59875" + integrity sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + "@sigstore/sign" "^1.0.0" + "@sigstore/tuf" "^1.0.3" + make-fetch-happen "^11.0.1" + +simple-update-notifier@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smart-buffer@^4.0.2, smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socket.io-adapter@~2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" + integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== + dependencies: + ws "~8.11.0" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.4.1: + version "4.7.4" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.4.tgz#2401a2d7101e4bdc64da80b140d5d8b6a8c7738b" + integrity sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.1.tgz#72f00d05f5d1f90f80974eda781cbd7107c125f2" + integrity sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA== + dependencies: + abab "^2.0.6" + iconv-lite "^0.6.3" + source-map-js "^1.0.2" + +source-map-support@0.5.21, source-map-support@^0.5.13, source-map-support@^0.5.19, source-map-support@^0.5.5, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz#c07a4ede25b16e4f78e6707bbd84b15a45c19c1b" + integrity sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sshpk@^1.7.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^10.0.0: + version "10.0.5" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" + integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== + dependencies: + minipass "^7.0.3" + +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +streamroller@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" + integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + fs-extra "^8.1.0" + +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-outer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +sudo-prompt@^9.1.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" + integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw== + +symbol-observable@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + +temp@^0.9.0: + version "0.9.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" + integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== + dependencies: + mkdirp "^0.5.1" + rimraf "~2.6.2" + +terser-webpack-plugin@^5.3.7: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@5.19.2: + version "5.19.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.2.tgz#bdb8017a9a4a8de4663a7983f45c506534f9234e" + integrity sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +terser@^5.26.0: + version "5.27.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" + integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.6, through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-each-async@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1" + integrity sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA== + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.2.0, tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== + dependencies: + escape-string-regexp "^1.0.2" + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + +tslib@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tuf-js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" + integrity sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg== + dependencies: + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-assert@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.9.tgz#8af9d4f93432c4970ec717e3006f33f135b06213" + integrity sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== + +typescript@5.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + +ua-parser-js@^0.7.30: + version "0.7.37" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.37.tgz#e464e66dac2d33a7a1251d7d7a99d6157ec27832" + integrity sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== + dependencies: + unique-slug "^3.0.0" + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + dependencies: + imurmurhash "^0.1.4" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +username@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/username/-/username-5.1.0.tgz#a7f9325adce2d0166448cdd55d4985b1360f2508" + integrity sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg== + dependencies: + execa "^1.0.0" + mem "^4.3.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vite@4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.2.tgz#d6ea8610e099851dad8c7371599969e0f8b97e82" + integrity sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w== + dependencies: + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" + optionalDependencies: + fsevents "~2.3.2" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-dev-middleware@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz#6bbc257ec83ae15522de7a62f995630efde7cc3d" + integrity sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ== + dependencies: + colorette "^2.0.10" + memfs "^3.4.12" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@4.15.1: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-merge@5.9.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.0.0, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack-subresource-integrity@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz#8b7606b033c6ccac14e684267cb7fb1f5c2a132a" + integrity sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q== + dependencies: + typed-assert "^1.0.8" + +webpack@5.88.2: + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which@^1.2.1, which@^1.2.14, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +word-wrap@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.13.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmlhttprequest@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@17.7.2, yargs@^17.0.1, yargs@^17.2.1, yargs@^17.6.2, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + 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" + +yargs@^16.0.2, yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yarn-or-npm@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz#6336eea4dff7e23e226acc98c1a8ada17a1b8666" + integrity sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ== + dependencies: + cross-spawn "^6.0.5" + pkg-dir "^4.2.0" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zone.js@0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.13.0.tgz#4c735cb8ef49312b58c0ad13451996dc2b202a6d" + integrity sha512-7m3hNNyswsdoDobCkYNAy5WiUulkMd3+fWaGT9ij6iq3Zr/IwJo4RMCYPSDjT+r7tnPErmY9sZpKhWQ8S5k6XQ== + dependencies: + tslib "^2.3.0"